什么是值的第一个参数('。')

时间:2016-10-17 03:48:36

标签: sql sql-server xml

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]'不是有效的   标识符

2 个答案:

答案 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的内容只不过是你得到的错误字符串。甚至没有分隔符......

您尝试执行名单列表......我只能希望,这不是您真正想要的: - )