Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 带参数的动态SQL,当参数值中有预定义的运算符时_Tsql_Sql Server 2005_Stored Procedures_Xquery_Dynamic Sql - Fatal编程技术网

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

Tsql 带参数的动态SQL,当参数值中有预定义的运算符时,tsql,sql-server-2005,stored-procedures,xquery,dynamic-sql,Tsql,Sql Server 2005,Stored Procedures,Xquery,Dynamic Sql,在T-SQL存储过程中有一种情况,在动态SQL中,参数引用其他变量,其值包含单引号和其他预定义运算符。问题是,当存在这种情况时,T-SQL脚本会失败 附件是一个示例代码,演示了这种情况。 你知道怎么解决这样的案子吗 DECLARE @TransVocObj XML,@xmlfragment XML,@SQL NVARCHAR(MAX) SELECT @TransVocObj = '<TransactionVoucherViewModel><TransactionR

在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

您可以使用替换功能将@attransation中的单引号字符加倍。因此,当您构建@xmlfragment时,它可能看起来像:

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

这是一个好主意,但我担心输入中可能会出现任何其他预定义的运算符。我不确定您的意思是什么运算符我不是XML向导,但您肯定可以使用相同的技术替换其他字符,如to和