6

我有一个带有 XML 参数的存储过程。

我的问题是关于 XML 的格式。

该解决方案的工作原理:

<ROOT><ids><id>2013-01-01</id></ids><ids><id>2013-01-02</id></ids></ROOT>
SELECT * FROM OPENXML(@handle, '/ROOT/id') WITH (idDate Date)

结果:2013-01-01 .. 2013-01-02

但是第二种解决方案不行,为什么?

<ROOT><id>2013-01-01</id><id>2013-01-02</id></ROOT>
SELECT * FROM OPENXML(@handle, '/ROOT') WITH (idDate Date)

结果:Null

XML 格式正确,不是吗?

4

1 回答 1

15

您声称有效的第一个查询实际上不适用于您提供的 XML。应该是这样的。

declare @handle int
declare @XML xml = '<ROOT><ids><id>2013-01-01</id></ids><ids><id>2013-01-02</id></ids></ROOT>'
exec sp_xml_preparedocument @handle out, @XML
select * from openxml(@handle, '/ROOT/ids', 2) with (id Date)
exec sp_xml_removedocument @handle

第二个版本应该是

declare @handle int
declare @XML xml = '<ROOT><id>2013-01-01</id><id>2013-01-02</id></ROOT>'
exec sp_xml_preparedocument @handle out, @XML
select * from openxml(@handle, '/ROOT/id', 2) with (id Date '.')
exec sp_xml_removedocument @handle

由于您使用的是 SQL Server 2008 或更高版本,因此您可以改用 XML 数据类型。

declare @XML xml = '<ROOT><id>2013-01-01</id><id>2013-01-02</id></ROOT>'

select T.N.value('text()[1]', 'date') as id
from @XML.nodes('ROOT/id') as T(N)
于 2013-02-15T10:52:12.083 回答