xquery中exist函数变量代替问题,巨变态

liclin 2006-12-29 01:06:20
declare @GroupName nvarchar(30)
declare @xml xml

set @GroupName = '同事'
set @xml = N'
<Userlist>
<Group Value="同事">
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964FF">
<UserName>TT</UserName>
<Phone>13819185363</Phone>
</User>
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964F1">
<UserName>YY</UserName>
<Phone>13507878345</Phone>
</User>
</Group>
<Group Value="MM">
<User ID="342354234324">
<UserName>若若</UserName>
<Phone>13852332443</Phone>
</User>
</Group>
</Userlist>
'

select @xml.exist(N'/Userlist/Group[(@Value cast as xs:string?) eq xs:string("同事")]
')
-------
精确查询时可以正常返回,可是要把“同事”替换成变量却找不到方法。
select @xml.exist(N'/Userlist/Group[@Value="同事"]') 这个精确查询也可以
下面的方法替换变量都不行,请帮帮忙。
select @xml.exist(N'/Userlist/Group[@Value="{@GroupName}"]')--变量不起作用
select @xml.exist(N'/Userlist/Group[@Value="{sql:variable("@GroupName")}"]')--提示错误
...全文
256 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rookie_one 2006-12-29
  • 打赏
  • 举报
回复
帮顶一下。

sql语句中的变量调用时候,如果是在拼串之中,需要''+变量名+''
liclin 2006-12-29
  • 打赏
  • 举报
回复
自己顶下!!!
liclin 2006-12-29
  • 打赏
  • 举报
回复
想偷懒下都不行,用动态SQL才可以搞定,不知道还有没别的方法
declare @GroupName nvarchar(30)
declare @xml xml

set @GroupName = '同事'
set @xml = N'
<Userlist>
<Group Value="同事">
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964FF">
<UserName>TT</UserName>
<Phone>13819185363</Phone>
</User>
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964F1">
<UserName>YY</UserName>
<Phone>13507878345</Phone>
</User>
</Group>
<Group Value="MM">
<User ID="342354234324">
<UserName>若若</UserName>
<Phone>13852332443</Phone>
</User>
</Group>
</Userlist>
'
declare @stmt nvarchar(4000)
set @stmt= 'select @xml.exist(''/Userlist/Group[@Value="'+@GroupName+'"]'')'
exec sp_executesql @stmt,N'@xml xml'
,@xml

--------------
返回1
liclin 2006-12-29
  • 打赏
  • 举报
回复
不好意思,上面的@stmt中一个</User>写成</UserName>了,完整的应该是下面
试过select @xml.exist(N'/Userlist/Group[@Value="'+@GroupName+N'"]')也不可以
下面的问题也想用变量代替,也碰到相应的问题:

declare @GroupName nvarchar(50)
declare @UserID nvarchar(36)
declare @UserName nvarchar(50)
declare @Phone nvarchar(20)
declare @stmt nvarchar(1000)

set @GroupName = 'GG'
set @UserID = '34526343434'
set @UserName = 'hehe'
set @Phone = '13853435345'
set @stmt = '
<Group Value="'+@GroupName+'">
<User ID="'+@UserID+'">
<UserName>'+@UserName+'</UserName>
<Phone>'+@Phone+'</Phone>
</User>
</Group>
'
declare @xml xml
set @xml = N'
<Userlist>
<Group Value="同事">
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964FF">
<UserName>TT</UserName>
<Phone>13819185363</Phone>
</User>
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964F1">
<UserName>YY</UserName>
<Phone>13507878345</Phone>
</User>
</Group>
<Group Value="MM">
<User ID="342354234324">
<UserName>若若</UserName>
<Phone>13852332443</Phone>
</User>
</Group>
</Userlist>
'
--这个想用@stmt代替不可,提示“xml 数据类型方法 "modify" 的参数 1 必须是字符串文字。”
set @xml.modify(
N'Insert '+@stmt+'
as last
into (/Userlist)[1]')
--下面注释部分使用可以
--set @xml.modify
-- (N'
-- insert
-- <Group Value="{sql:variable("@GroupName")}">
-- <User ID="{sql:variable("@UserID")}">
-- <UserName>{sql:variable("@UserName")}</UserName>
-- <Phone>{sql:variable("@Phone")}</Phone>
-- </User>
-- </Group>
-- as last
-- into (/Userlist)[1]')
select @xml
liclin 2006-12-29
  • 打赏
  • 举报
回复
试过select @xml.exist(N'/Userlist/Group[@Value="'+@GroupName+N'"]')也不可以
下面的问题也想用变量代替,也碰到相应的问题:

declare @GroupName nvarchar(50)
declare @UserID nvarchar(36)
declare @UserName nvarchar(50)
declare @Phone nvarchar(20)
declare @stmt nvarchar(1000)

set @GroupName = 'GG'
set @UserID = '34526343434'
set @UserName = 'hehe'
set @Phone = '13853435345'
set @stmt = '
<Group Value="'+@GroupName+'">
<User ID="'+@UserID+'">
<UserName>'+@UserName+'</UserName>
<Phone>'+@Phone+'</Phone>
</UserName>
</Group>
'
declare @xml xml
set @xml = N'
<Userlist>
<Group Value="同事">
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964FF">
<UserName>TT</UserName>
<Phone>13819185363</Phone>
</User>
<User ID="6F9619FF-8B86-D011-B42D-00C04FC964F1">
<UserName>YY</UserName>
<Phone>13507878345</Phone>
</User>
</Group>
<Group Value="MM">
<User ID="342354234324">
<UserName>若若</UserName>
<Phone>13852332443</Phone>
</User>
</Group>
</Userlist>
'
--这个想用@stmt代替不可,提示“xml 数据类型方法 "modify" 的参数 1 必须是字符串文字。”
set @xml.modify(
N'Insert '+@stmt+'
as last
into (/Userlist)[1]')
--下面注释部分使用可以
--set @xml.modify
-- (N'
-- insert
-- <Group Value="{sql:variable("@GroupName")}">
-- <User ID="{sql:variable("@UserID")}">
-- <UserName>{sql:variable("@UserName")}</UserName>
-- <Phone>{sql:variable("@Phone")}</Phone>
-- </User>
-- </Group>
-- as last
-- into (/Userlist)[1]')
select @xml

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧