臭い。これは発見するのに本当に便利なスレッドでした。
私はまだこれらの提案のいくつかを混乱させていました。文字列でvalue
with を使用すると[1]
、最初の値のみが取得されます。そして、いくつかの提案を使用することをお勧めしますcross apply
は、(私のテストでは)whichして、あまりにも多くのデータを返しただけであるとた。
そこで、xml
オブジェクトを作成し、その値をテーブルに読み取る方法の簡単な例を次に示します。
DECLARE @str nvarchar(2000)
SET @str = ''
SET @str = @str + '<users>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Mike</firstName>'
SET @str = @str + ' <lastName>Gledhill</lastName>'
SET @str = @str + ' <age>31</age>'
SET @str = @str + ' </user>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Mark</firstName>'
SET @str = @str + ' <lastName>Stevens</lastName>'
SET @str = @str + ' <age>42</age>'
SET @str = @str + ' </user>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Sarah</firstName>'
SET @str = @str + ' <lastName>Brown</lastName>'
SET @str = @str + ' <age>23</age>'
SET @str = @str + ' </user>'
SET @str = @str + '</users>'
DECLARE @xml xml
SELECT @xml = CAST(CAST(@str AS VARBINARY(MAX)) AS XML)
-- Iterate through each of the "users\user" records in our XML
SELECT
x.Rec.query('./firstName').value('.', 'nvarchar(2000)') AS 'FirstName',
x.Rec.query('./lastName').value('.', 'nvarchar(2000)') AS 'LastName',
x.Rec.query('./age').value('.', 'int') AS 'Age'
FROM @xml.nodes('/users/user') as x(Rec)
そしてここに出力があります:

奇妙な構文ですが、適切な例を使用すれば、独自のSQL Server関数に追加するのは簡単です。
そういえば、これがこの質問に対する正しい答えです。
@xml
タイプの変数にxmlデータがあると仮定するとxml
(上記の例で示したように)、質問で引用されたxmlから3行のデータを返す方法は次のとおりです。
SELECT
x.Rec.query('./firstName').value('.', 'nvarchar(2000)') AS 'FirstName',
x.Rec.query('./lastName').value('.', 'nvarchar(2000)') AS 'LastName'
FROM @xml.nodes('/person') as x(Rec)
