declare @cols nvarchar(max)
set @cols = (select distinct quotename(name)
from students
for xml path(''),type).value('.','nvarchar(max)')
exec @cols
值函数的第一个参数('。')是什么,为什么会出现此错误?
Msg 203,Level 16,State 2,Line 3
名字' [pavan] [pramod] [sachin] [shital] [shubham] [sonika]'不是有效的 标识符
答案 0 :(得分:0)
尝试选择而不是exec。因为您将@cols
值设置为名称而不是某些查询。
declare @cols nvarchar(max)
set @cols=(select distinct quotename(name) from students for xml path(''),type).value('.','nvarchar(max)')
SELECT @cols
使用FOR XML PATH('')
时,您创建的XML值包含学生表中的所有名称,如下面的变量@myDoc
DECLARE @myDoc xml
SET @myDoc = '
<Name> Mr. X
</Name>
<Name> Mr. Y
</Name>
<Name> Mr. Z
</Name> '
使用value('.', 'varchar(max)')
,您只需选择除xml标记之外的所有值,并将其转换为varchar(max)。
SELECT @myDoc.value('.', 'varchar(max)' ) -- will return 'Mr. X Mr. Y Mr. Z'
您还可以选择具有以下订单的特定名称
SELECT @myDoc.value('(/Name)[1]', 'varchar(max)' ) -- will return Mr. X
SELECT @myDoc.value('(/Name)[2]', 'varchar(max)' ) -- will return Mr. Y
SELECT @myDoc.value('(/Name)[3]', 'varchar(max)' ) -- will return Mr. Z
答案 1 :(得分:0)
在你的问题中有两个问题:
1)实际问题:XPath中的点是什么
点指向current
元素。使用XPath
/ XQuery
读取XML就像在树中导航一样。你可以走得更深,然后就可以回去了。
没有任何动作,当前元素是第一个(在大多数情况下这是根)元素。
但是有些方法,尤其是.query()
和.nodes()
将当前元素设置为另一个。
检查
DECLARE @xml XML=
(N'<root>
<Level1 nodeLevel="level1">
<Level2 nodeLevel="level2">test</Level2>
</Level1>
</root>');
SELECT @xml.query('.') AS ThisIsTheCurrentNode
SELECT @xml.query('/root/Level1').query('.') AS NowLevel1IsTheCurrentNode
SELECT @xml.query('/root/Level1').query('.').value('(Level1/@nodeLevel)[1]','nvarchar(100)') AS AndThisLevel1Attribute
,@xml.query('/root/Level1/Level2').query('.').value('.','nvarchar(100)') AS AndThisLevel2Value
2)为什么会出现这个错误?
你试试
declare @cols nvarchar(max)
set @cols = (select distinct quotename(name)
from students
for xml path(''),type).value('.','nvarchar(max)')
exec @cols
你得到了
Msg 203,Level 16,State 2,Line 3名称 &#39; [帕] [普拉莫德] [萨钦] [清淳] [shubham] [索尼卡]&#39;不是有效的 标识符
你期待什么?您的陈述只会连接students.name
的(引用)值。因此@cols
的内容只不过是你得到的错误字符串。甚至没有分隔符......
您尝试执行名单列表......我只能希望,这不是您真正想要的: - )