2017-06-13 14 views
1

私はXML列からデータをフォーマットしたいと考えています。私はstackoverflowを検索し、いくつかの良い例を見つけました。SQLはXMLフィールドからデータを取得します

出典:XMLは以下のように見える

SELECT 
    b.x.value('/CustomDataResponse[1]/FieldData[1]/FieldData[1]/FieldName[1]', 'varchar(100)') as Name 
    ,b.x.value('/CustomDataResponse[1]/FieldData[1]/FieldData[1]/FieldDataValue[1]', 'varchar(100)') as Value 

FROM 
    MyTable a 
    CROSS APPLY (
        SELECT 
        CAST(CAST ([XMLVAL] AS NVARCHAR(MAX)) AS XML) x 
       ) b; 

<CustomDataResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <AccountID>0</AccountID> 
    <UserNumber xsi:nil="true" /> 
    <Workstation xsi:nil="true" /> 
    <SerialNumber xsi:nil="true" /> 
    <Set>0</Set> 
    <SecurityID>0000000</SecurityID> 
    <SecurityType>Equity</SecurityType> 
    <FieldData> 
    <FieldData> 
     <FieldName>ISSUER</FieldName> 
     <FieldDataValue>ABC INC</FieldDataValue> 
    </FieldData> 
    <FieldData> 
     <FieldName>TICKER</FieldName> 
     <FieldDataValue>ABC</FieldDataValue> 
    </FieldData> 
    <FieldData> 
     <FieldName>SECURITY_TYP</FieldName> 
     <FieldDataValue>PUBLIC</FieldDataValue> 
    </FieldData> 
    </FieldData> 
</CustomDataResponse> 

このクエリとXMLを、私は

enter image description hereとなりますCONVERTING SQL NVARCHAR(MAX) TO XML and getting a Value from XML string

私のクエリがどのように見えます

Ticker、Security_typなどの他のフィールドを使用するように拡張するにはどうすればよいですか? ありがとうございます。

+0

OK。 XMLを投稿しました。 – ProgSky

答えて

2

一つの方法は、NVARCHAR(MAX)からXMLVALの理由中間キャストところで

SELECT Issuer = c.x.value('FieldData[FieldName[. = ''ISSUER'']][1]/FieldDataValue[1]' 
         ,'varchar(100)'), 
     Ticker = c.x.value('FieldData[FieldName[. = ''TICKER'']][1]/FieldDataValue[1]' 
         ,'varchar(100)'), 
     SecurityType = c.x.value('FieldData[FieldName[. = ''SECURITY_TYP'']][1]/FieldDataValue[1]' 
         ,'varchar(100)') 
FROM MyTable a 
     CROSS APPLY (SELECT CAST(CAST ([XMLVAL] AS NVARCHAR(MAX)) AS XML) x) b 
     CROSS APPLY b.x.nodes('/CustomDataResponse[1]/FieldData[1]') c(x); 

でしょうか?

+0

素晴らしい!作品!あなたは正しいです、キャストする必要はありませんNVARCHAR(MAX) – ProgSky

+1

最も印象的です。私はOPの行が必要だと思ったが、それでもあなたのアプローチは私には起こらなかっただろう。 –

2

さらに別のオプション

Declare @YourTable table (ID int,XMLVal varchar(max)) 
Insert Into @YourTable values 
(1,'<CustomDataResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><AccountID>0</AccountID><UserNumber xsi:nil="true" /><Workstation xsi:nil="true" /><SerialNumber xsi:nil="true" /><Set>0</Set><SecurityID>0000000</SecurityID><SecurityType>Equity</SecurityType><FieldData><FieldData><FieldName>ISSUER</FieldName><FieldDataValue>ABC INC</FieldDataValue></FieldData><FieldData><FieldName>TICKER</FieldName><FieldDataValue>ABC</FieldDataValue></FieldData><FieldData><FieldName>SECURITY_TYP</FieldName><FieldDataValue>PUBLIC</FieldDataValue></FieldData></FieldData></CustomDataResponse>') 

Select A.ID 
     ,C.* 
From @YourTable A 
Cross Apply (Select XMLData=cast(A.XMLVal as xml)) B 
Cross Apply (
       Select [Name] = r.n.value('(FieldName)[1]','varchar(50)') 
         ,[Value] = r.n.value('(FieldDataValue)[1]','varchar(50)') 
       From B.[XMLData].nodes('CustomDataResponse/FieldData/*') r(n) 
      ) C 

戻り

ID Name   Value 
1 ISSUER   ABC INC 
1 TICKER   ABC 
1 SECURITY_TYP PUBLIC 
+0

ありがとうジョン。あなたのソリューションも機能します! – ProgSky

関連する問題