Tsql 属性的XML DML查询 declare@mydocxml 设置@myDoc= 1年零件和劳动力 可提供3年零件和人工延长维护 ' ;使用XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance“作为xsi,”http://www.w3.org/2001/XMLSchema'作为xsd,默认'http://www.mydomain.org/MySchema.xsd' ) 选择@myDoc.value('/Form[@SectionId][0],'varchar')

Tsql 属性的XML DML查询 declare@mydocxml 设置@myDoc= 1年零件和劳动力 可提供3年零件和人工延长维护 ' ;使用XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance“作为xsi,”http://www.w3.org/2001/XMLSchema'作为xsd,默认'http://www.mydomain.org/MySchema.xsd' ) 选择@myDoc.value('/Form[@SectionId][0],'varchar'),tsql,xquery-sql,xml-dml,Tsql,Xquery Sql,Xml Dml,我需要获取SectionId的属性值作为nvarchar?我该怎么做 T和R 标记你可以写得更简单: ;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd' ) SELECT Node.value('@SectionId', '

我需要获取SectionId的属性值作为nvarchar?我该怎么做

T和R
标记

你可以写得更简单:

;WITH XMLNAMESPACES(  'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd' )
SELECT Node.value('@SectionId', 'VARCHAR(100)') AS SectionId
FROM @myDoc.nodes('/Form') TempXML (Node);
由于您从未使用/引用任何
xsi
xsd
名称空间,因此无需声明这些名称空间


由于您只从一个元素中获取一个属性,因此使用
.nodes()
函数来创建内部“虚拟表”也没有任何意义。

谢谢marc,但我没有添加名称空间,所以xml的生产者必须保留名称空间,因为SELECT返回空值,没有名称空间。真正的xml实际上存储在非类型化的xml列中,而不是xml类型的变量。我使用的是.nodes(),因为我不能保证只有一个。但我明白你的意思。
;WITH XMLNAMESPACES(  'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd' )
SELECT Node.value('@SectionId', 'VARCHAR(100)') AS SectionId
FROM @myDoc.nodes('/Form') TempXML (Node);
;WITH XMLNAMESPACES(DEFAULT 'http://www.mydomain.org/MySchema.xsd')
SELECT @myDoc.value('(/Form/@SectionId)[1]', 'VARCHAR(100)') AS SectionId