带参数的动态SQL,当参数值内部有预定义的运算符时

时间:2012-05-29 13:24:18

标签: tsql sql-server-2005 stored-procedures xquery dynamic-sql

我有一个T-SQL存储过程的情况,在动态SQL中,参数/ s,引用其他变量,其值具有单引号和其他预定义运算符。当存在这样的情况时,问题是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

1 个答案:

答案 0 :(得分:1)

您可以使用REPLACE函数将@Narration中的单引号字符加倍。因此,当您构建@xmlfragment时,它看起来像:

Select @xmlfragment= 
                '<TransactionRow>'+'<Description>'+REPLACE(@Narration,'''','''''')+'</Description>'+'<DebitAmount>'+CONVERT(VARCHAR(30),500.00)+'</DebitAmount>'+'</TransactionRow>'