0

T-SQL ストアド プロシージャで状況が発生しました。動的 SQL では、パラメーターが他の変数を参照し、その値には一重引用符と他の事前定義された演算子があります。問題は、そのような条件が存在する場合、T-SQL スクリプトが失敗することです。

このような状況を示すサンプル コードが添付されています。そのような場合を解決する方法はありますか?

    DECLARE @TransVocObj  XML,@xmlfragment XML,@SQL NVARCHAR(MAX)
SELECT @TransVocObj  =  '<TransactionVoucherViewModel><TransactionRows></TransactionRows></TransactionVoucherViewModel>'
                DECLARE @Narration varchar(100)
                SET @Narration ='AABBCC''DD''EEFF'-- @Narration ='AABBCCDDEEFF'
                Select @xmlfragment=
                '<TransactionRow>'+'<Description>'+@Narration +'</Description>'+'<DebitAmount>'+CONVERT(VARCHAR(30),500.00)+'</DebitAmount>'+'</TransactionRow>'
                SET @SQL=N' SET @TransVocObj.modify(''insert '+ CONVERT(NVARCHAR(MAX),@xmlfragment)+'   into (/TransactionVoucherViewModel/TransactionRows)[1] '') '
                EXECUTE sp_executesql @SQL,N'@TransVocObj XML Output,@xmlfragment XML',@TransVocObj OUTPUT,@xmlfragment
SELECT T.Item.query('.//Description').value('.','VARCHAR(60)') FROM  @TransVocObj.nodes('//TransactionRows/TransactionRow') AS T(Item)

データベース サーバーは MS SQL SERVER 2005 です。

4

1 に答える 1

1

REPLACE 関数を使用して、@Narration 内で一重引用符を二重にすることができます。したがって、@xmlfragment をビルドすると、次のようになります。

Select @xmlfragment= 
                '<TransactionRow>'+'<Description>'+REPLACE(@Narration,'''','''''')+'</Description>'+'<DebitAmount>'+CONVERT(VARCHAR(30),500.00)+'</DebitAmount>'+'</TransactionRow>' 
于 2012-05-29T21:18:34.260 に答える