Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么OPENXML只返回一个元素_Sql Server_Xml_Tsql_Openxml - Fatal编程技术网

Sql server 为什么OPENXML只返回一个元素

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

有人能解释一下为什么这个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

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