2016-09-21 15 views
2

連結処理中にnull xml要素をnull値に置き換えようとしています。そして私はいくつかのばかげたミスをしています。私は空の値とヌル値を区別したい。 XMLデータを解析するのにOpenXMLを使用していますが、nullベースのparam要素を読み取るコードには何かがありません。Sql Server - XMLの場合 - 要素からヌル値を取得する

私はServer Server 2014を使用しています。

お勧めします。

DECLARE @message_body XML; 
DECLARE @XMLParameterData Table 
         (SeqID INT Identity(1,1), 
         ParamValue varchar(max)) 

DECLARE @docRef int 
DECLARE @dataPath nvarchar(255) 
DECLARE @mappingType int = 2 --Element-Centric mapping 

Select @message_body = N'<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
                    <ParamList>                 <Param>Bruce</Param> 
                    <Param>Wa''yne</Param> 
                    <Param>[email protected]</Param> 
                    <Param>Coke</Param> 
                    <Param>20000</Param>                  
                    <Param xsi:nil="true"/> 
                    <Param></Param> 
                   </ParamList> 
                </AsyncRequest>'; 


Set @dataPath = '/AsyncRequest/ParamList/Param' 
EXEC sp_xml_preparedocument @docRef output, @message_body 

INSERT INTO @XMLParameterData(ParamValue) 
     Select * From OpenXML(@docRef, @dataPath, @mappingType) 
        WITH 
          (        
           valx varchar(max) '.' 
          ) 

-- the xml document ref needs to be released ASAP  
EXEC sp_xml_removedocument @docRef 

SELECT * From @XMLParameterData 
DECLARE @CSVString varchar(max) 
SELECT @CSVString = STUFF( 
          (SELECT ', ' + 
          CHAR(34) + ParamValue + CHAR(34) 
          FROM @XMLParameterData 
          ORDER BY SeqID 
          FOR XML PATH('')         
          ), 1, 1, '') 

SELECT @CSVString as CSVTest 

出力: - "ブルース"、 "Wa'yne"、 "[email protected]"、 "コーラ"、 "20000"、 ""、 ""

所望の出力: - "ブルース"、 "Wa'yne"、 "[email protected]"、 "コーラ"、 "20000"、NULL、 "" 私は少しして、コードを単純化している(これについてはどのように

答えて

2

DECLARE @message_body XML, 
     @output nvarchar(max); 

select @message_body = N'<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ParamList>                 
     <Param>Bruce</Param> 
     <Param>Wa''yne</Param> 
     <Param>[email protected]</Param> 
     <Param>Coke</Param> 
     <Param>20000</Param>                  
     <Param xsi:nil="true"/> 
     <Param></Param> 
    </ParamList> 
</AsyncRequest>'; 

SELECT @output = STUFF((
    SELECT 
      CASE WHEN t.v.value('@xsi:nil','nvarchar(max)') = 'true' THEN ',NULL' 
        ELSE ',"'+t.v.value('.','nvarchar(max)') + '"' 
         END 
    FROM @message_body.nodes('AsyncRequest/ParamList/Param') as t(v) 
    FOR XML PATH('') 
),1,1,'') 

SELECT @output 

戻ります:@xsi:nil="true".nodes代わりのOPENXMLがかどうかを確認するためにCASE WHENを使用して、あなたが達成しようとしている何

"Bruce","Wa'yne","[email protected]","Coke","20000",NULL,"" 
+0

ありがとう、それは働いた:-) – Karan

+0

私の喜び! :) – gofr1

1

XML文書ではなくxml.nodesを使用します)。

xsi:nilがtrueの場合、xmlクエリ式.[not(@xsi:nil = "true")]を使用してnullを返します。

DECLARE @message_body XML; 
DECLARE @XMLParameterData Table 
         (SeqID INT Identity(1,1), 
         ParamValue varchar(max)) 


Select @message_body = N'<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><ParamList><Param>Bruce</Param><Param>Wa''yne</Param> 
                    <Param>[email protected]</Param> 
                    <Param>Coke</Param> 
                    <Param>20000</Param>                  
                    <Param xsi:nil="true"/> 
                    <Param></Param> 
                   </ParamList> 
                </AsyncRequest>'; 


INSERT INTO @XMLParameterData(ParamValue) 
SELECT T.c.value('.[not(@xsi:nil = "true")]', 'varchar(max)') AS result 
FROM @message_body.nodes('/AsyncRequest/ParamList/Param')T(c) 

SELECT * From @XMLParameterData 
DECLARE @CSVString varchar(max) 
SELECT @CSVString = STUFF( 
          (SELECT ', ' + 
          CHAR(34) + COALESCE(ParamValue, 'NULL') + CHAR(34) 
          FROM @XMLParameterData 
          ORDER BY SeqID 
          FOR XML PATH('')         
          ), 1, 1, '') 

SELECT @CSVString as CSVTest 

これが返されます:

私は、文字列NULLが返される 'NULL' を返すためにCOALESCEを使用 "ブルース"、 "Wa'yne"、 "[email protected]" を、 "コークス"、 "20000"、 "NULL"、 ""

0

は、標準的な動作ではありません。あなたはpropbably以下の期待:

DECLARE @message_body XML = N'<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ParamList> 
    <Param>Bruce</Param> 
    <Param>Wa''yne</Param> 
    <Param>[email protected]</Param> 
    <Param>Coke</Param> 
    <Param>20000</Param>                  
    <Param xsi:nil="true"/> 
    <Param></Param> 
    </ParamList> 
</AsyncRequest>'; 

SELECT X.value('.[not(@xsi:nil="true")]', 'nvarchar(MAX)') Value 
FROM @message_body.nodes('//Param') T(X) 

Value 
----- 
Bruce 
Wa'yne 
[email protected] 
Coke 
20000 
NULL 
(empty string here) 

をあなたはより標準化されているノードからテキスト、よいでしょう:<element/><element></element>は同義語であることを

SELECT X.value('text()[1]', 'nvarchar(MAX)') Value 
FROM @message_body.nodes('//Param') T(X) 

Value 
----- 
Bruce 
Wa'yne 
[email protected] 
Coke 
20000 
NULL 
NULL 

注意を。どのように書いても、それは空です。最初に<element/>空の文字列ですか?それは長い議論につながります。それはすべて解釈の問題です。空白を処理する属性は、xml:spaceとすることもできます。

関連する問題