web-dev-qa-db-ja.com

SQL Server Select in XMLフィールド

以下の状況についてサポートが必要です:

私のテーブルSQLServer 2012にはxml値を持つフィールドがあります。そのフィールドでデータを選択し、フォームの列に結果を表示したいと思います。

Image1

<row> 
  <ID_Cota>162986</ID_Cota>
  <ID_Taxa_Plano>1000</ID_Taxa_Plano>
  <ID_Plano_Venda>1020</ID_Plano_Venda>
  <ID_Pessoa>18522</ID_Pessoa>
</row>

ありがとうございました。

1
VAraujo

_CROSS APPLY_および 。nodes XMLデータ型のメソッドを使用します。たとえば、次のようにします。

_IF OBJECT_ID('dbo.yourTable') IS NOT NULL DROP TABLE dbo.yourTable
GO
CREATE TABLE dbo.yourTable ( 
    rowId INT IDENTITY PRIMARY KEY, 
    ST_Registro_Del XML
)
GO

INSERT INTO dbo.yourTable ( ST_Registro_Del )
SELECT '<row> 
  <ID_Cota>162986</ID_Cota>
  <ID_Taxa_Plano>1000</ID_Taxa_Plano>
  <ID_Plano_Venda>1020</ID_Plano_Venda>
  <ID_Pessoa>18522</ID_Pessoa>
</row>'
GO


SELECT 
    r.c.value('(ID_Cota/text())[1]', 'INT' ) AS ID_Cota,
    r.c.value('(ID_Taxa_Plano/text())[1]', 'INT' ) AS ID_Cota,
    r.c.value('(ID_Plano_Venda/text())[1]', 'INT' ) AS ID_Cota,
    r.c.value('(ID_Pessoa/text())[1]', 'INT' ) AS ID_Cota
FROM dbo.yourTable yt
    CROSS APPLY yt.ST_Registro_Del.nodes('row') r(c)
WHERE rowId = 1
_

これが私の結果です:

test results

_.nodes_メソッドは、XMLから結果セットを返します。型指定されていないXML(つまり、XSDがXML列と_[1]_序数に関連付けられていない)をクエリするときのパフォーマンスを向上させるには、text()アクセサーを使用します。あなたが見つけます"。

HTH

7
wBob

私のxQueryはrustyであると私が最初に言うかもしれませんが、次のことがうまくいきました:

WITH    xml_string
AS      (
        SELECT val = CAST('<row><ID_Cota>162986</ID_Cota><ID_Taxa_Plano>1000</ID_Taxa_Plano><ID_Taxa_Venda>1020</ID_Taxa_Venda><ID_Pessoa>18522</ID_Pessoa></row>' AS XML)
        )
SELECT  val,
        (val).value('(/row[1]/ID_Cota[1])', 'INT'),
        (val).value('(/row[1]/ID_Taxa_Plano[1])', 'INT'),
        (val).value('(/row[1]/ID_Taxa_Venda[1])', 'INT'),
        (val).value('(/row[1]/ID_Pessoa[1])', 'INT')
FROM    xml_string;

テーブルからクエリを実行するように編集:

WITH    xml_string
AS      (
        SELECT val = CAST('<row><ID_Cota>162986</ID_Cota><ID_Taxa_Plano>1000</ID_Taxa_Plano><ID_Taxa_Venda>1020</ID_Taxa_Venda><ID_Pessoa>18522</ID_Pessoa></row>' AS XML)
        )
SELECT  val
INTO    ST_Registro_Del
FROM    xml_string;

-- run from the table here:
SELECT  val,
        ID_Cota       = (val).value('(/row[1]/ID_Cota[1])', 'INT'),
        ID_Taxa_Plano = (val).value('(/row[1]/ID_Taxa_Plano[1])', 'INT'),
        ID_Taxa_Venda = (val).value('(/row[1]/ID_Taxa_Venda[1])', 'INT'),
        ID_Pessoa     = (val).value('(/row[1]/ID_Pessoa[1])', 'INT')
FROM    ST_Registro_Del
1
Shaneis

以下はあなたを助けます

declare @sql xml 
set @sql = '<row> 
  <ID_Cota>162986</ID_Cota>
  <ID_Taxa_Plano>1000</ID_Taxa_Plano>
  <ID_Plano_Venda>1020</ID_Plano_Venda>
  <ID_Pessoa>18522</ID_Pessoa>
</row>'

select s.n.value('(ID_Cota)[1]', 'int') as ID_Cota
        ,s.n.value('(ID_Taxa_Plano)[1]', 'int') as ID_Taxa_Plano
        ,s.n.value('(ID_Plano_Venda)[1]', 'int') as ID_Plano_Venda
        ,s.n.value('(ID_Pessoa)[1]', 'int') as ID_Pessoa
from @sql.nodes('/row') as s(n)

enter image description here

1
Kin Shah