2

難しいことをすべて処理した後、おそらく簡単なことをしようとしているのですが、これが頭を悩ませているようです。Xml要素を構築するためのnvarchar変数である変数@strXmlにテキストを連結しようとしていますが、@strXmlはnullを返します。助けてください。以下にコードを掲載しています。

DECLARE @strXml nvarchar(max) = ''
SET @strXml = '<PromoName>' + (Select PromoName From #Temp) + '</PromoName>' 
SET @strXml = @strXml + '<PromoDesc>' + (Select PromoDesc From #Temp) + '</PromoDesc>'
SET @strXml = @strXml + '<PromoCode>' + (Select PromoCode From #Temp) + '</PromoCode>' 
SET @strXml = @strXml + '<BeginDate>' + (Select Convert(nvarchar, BeginDate) From #Temp) + '</BeginDate>'
SET @strXml = @strXml + '<EndDate>' + (Select Convert(nvarchar, EndDate) From #Temp) + '</EndDate>'
SET @strXml = @strXml + '<RawHtml>' + (Select RawHtml From #Temp) + '</RawHtml>'
SET @strXml = @strXml + '<FocusPromoInd>' + Convert(nvarchar, 0) + '</FocusPromoInd>'
SET @strXml = @strXml + '<ParentPromoCode>' + (Select ParentPromoCode From #Temp) + '</ParentPromoCode>'
SET @strXml = @strXml + '<ActiveInd>' + (Select Case When ActiveInd=1 Then '1' Else '0' End From #Temp) + '</ActiveInd>'
SET @strXml = @strXml + '<AreaID>' + (Select Convert(nvarchar, AreaID) From #Temp) + '</AreaID>'
SET @strXml = '<PromoData><Promotion>' + @strXml + '</Promotion></PromoData>'
Select @strXml as strXML

最後のクエリを実行すると、null が返されます。デバッグ モードでも、@strXml が各行の値で更新されたことを確認できません。助けてください!ありがとう。

4

5 に答える 5

5

連結しているフィールドの 1 つが null です。

SQL で文字列と null 値を連結すると、結果は常に null になります。

COALESCE コマンドを使用して修正できます。

declare @strXml nvarchar(max) = ''
set @strXml = '<PromoName>' + (select coalesce(PromoName, '') from #Temp) +
    '</PromoName>'
-- and so on
于 2010-08-03T18:06:29.970 に答える
1

文字列を null と連結すると、結果は null になります。したがって、取得した値の 1 つだけが null の場合、結果全体が null になります。

isnull( ... , '')null 値の可能性がある値を空の文字列に変換するために使用できます。

また、同じテーブルから多くの選択を使用する代わりに、単一の選択を使用できます。

select @strXml =
  '<PromoData><Promotion>' +
  '<PromoName>' + PromoName + '</PromoName>' +
  '<PromoCode>' + PromoCode + '</PromoCode>' +
  ...
  '<AreaID>' + convert(nvarchar, AreaID) + '</AreaID>'
  '</Promotion></PromoData>'
from #Temp
于 2010-08-03T18:08:52.087 に答える
1

連結内のいずれかの値が NULL の場合、結果の文字列も NULL になります。NULL 値を空白にしたいだけの場合は、代わりに SQL NULL 関数の 1 つを使用して空の文字列を返すことができます。さまざまな SQL エンジンでサポートされている関数の完全なリストについては、W3Schools SQL NULL 関数を参照してください。

于 2010-08-03T18:09:32.117 に答える
1

NULL を含む式はすべて NULL と評価されます。したがって、任意の列に単一の NULL があると、他のすべての値が消去されます。ISNULL 関数を使用すると、この問題を回避できます。コードを次のように構造化することを検討してください。

DECLARE @xml nvarchar(max)

SET @xml = 
(
    SELECT ISNULL(PromoName,'') AS PromoName
        , ISNULL(PromoDesc,'') AS PromoDesc
        , ISNULL(PromoCode,'') AS PromoCode
        --etc.
    FROM #Temp
    FOR XML RAW('Promotion'), ELEMENTS
)

この例では、SQLServer の FOR XML 句の単純なバージョンも使用しています。TSQL でデータを XML 文字列に変換する場合は、この言語機能を検討することをお勧めします。この手法は、他のデータベース プラットフォームには適用されません。

于 2010-08-03T18:10:27.353 に答える
1

他の人が指摘したように、文字列を NULL と連結すると NULL になります。SQL Server にはこれを制御するオプションがあるためSET CONCAT_NULL_YIELDS_NULL OFF、クエリの前に配置すると問題が解決するはずです。

于 2010-08-03T18:13:12.123 に答える