Sql server 为什么OPENXML只返回一个元素
有人能解释一下为什么这个T-SQL代码只返回一行值为“1”的行吗?我希望得到两行(“1”和“2”)。我是不是遗漏了什么Sql server 为什么OPENXML只返回一个元素,sql-server,xml,tsql,openxml,Sql Server,Xml,Tsql,Openxml,有人能解释一下为什么这个T-SQL代码只返回一行值为“1”的行吗?我希望得到两行(“1”和“2”)。我是不是遗漏了什么 DECLARE @XMLDoc2 XML SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>' DECLARE @handle2 INT EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2 SEL
DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
DECLARE @handle2 INT
EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2
SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT 'id')
EXEC sp_xml_removedocument @handle2
DECLARE@XMLDoc2 XML
选择@XMLDoc2='12'
声明@handle2 INT
EXEC sp_xml_preparedocument@handle2输出@XMLDoc2
使用(id INT'id')从OPENXML(@handle2,'/ids',2)中选择*
EXEC sp_xml_removedocument@handle2
注意:我正在使用SQL Server 2008
非常感谢 忘了openxml的无意义性吧,它速度慢、麻烦、不可用,而且很糟糕。使用,它们速度快、直观、用户友好,而且非常好:
DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
select x.value(N'.', N'int') as id
from @XMLDoc2.nodes(N'/ids/id') t(x);
DECLARE@XMLDoc2 XML
选择@XMLDoc2='12'
选择x.value(N'.'和N'int')作为id
来自@XMLDoc2.nodes(N'/ids/id')t(x);
为什么不在SQL Server 2005及更高版本的XML变量上使用新的.nodes()方法
DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
SELECT
ids.id.value('.', 'int') 'id'
FROM
@xmldoc2.nodes('/ids/id') ids(id)
DECLARE@XMLDoc2 XML
选择@XMLDoc2='12'
挑选
id.id.value('.',int')'id'
从…起
@xmldoc2.nodes('/ids/id')id(id)
这给了我预期的“1”和“2”值。您的xpath是到ids的,因此id是ids的属性,但事实并非如此,因此您需要 通过使用..向上移动树来指定xpath。。然后指定节点。节点由
。/id
指定,属性由指定。/@which
SELECT * FROM OPENXML (@handle2, '/ids', 2) WITH (id INT '../id')
我也有同样的问题,我在另一个网站上找到了答案。必须使用“/ids/id”而不是“/ids”,然后在WITH子句中使用“.”
DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
DECLARE @handle2 INT
EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2
SELECT * FROM OPENXML (@handle2, '/ids/id', 2) WITH (id INT '.')
EXEC sp_xml_removedocument @handle2
DECLARE@XMLDoc2 XML
选择@XMLDoc2='12'
声明@handle2 INT
EXEC sp_xml_preparedocument@handle2输出@XMLDoc2
从OPENXML(@handle2'/ids/id',2)中选择*并使用(id INT'.'))
EXEC sp_xml_removedocument@handle2
声明@XMLDoc2 XML
选择@XMLDoc2='12'
声明@handle2 INT
EXEC sp_xml_preparedocument@handle2输出@XMLDoc2
从OPENXML(@handle2'/ids/id',2)中选择*并使用(id INT'.'))
EXEC sp_xml_removedocument@handle2
嗯,我当时正急着推出《渗出善良》,我喜欢它的声音;)t.x.value
或x.value
,两者都有效(我甚至在发布之前就已经测试过了!)t
在此上下文中是一个表别名,并且不是必需的,因为只有一个可能的x
,因此可以明确地解析名称。@Remus:啊,好吧-在我学习SQL XML的教程中,他们从来没有提到表别名是可选的-不过很高兴知道!
DECLARE @XMLDoc2 XML
SELECT @XMLDoc2 = '<ids><id>1</id><id>2</id></ids>'
DECLARE @handle2 INT
EXEC sp_xml_preparedocument @handle2 OUTPUT, @XMLDoc2
SELECT * FROM OPENXML (@handle2, '/ids/id', 2) WITH (id INT '.')
EXEC sp_xml_removedocument @handle2