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

しかし、2番目の解決策はそうではありません。なぜですか?

<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

2番目のバージョンは

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 に答える