0

У меня есть ситуация в хранимой процедуре T-SQL, где в динамическом SQL параметр/s ссылается на другие переменные, значение которых имеет одинарные кавычки и другие предопределенные операторы. Проблема заключается в том, что скрипт T-SQL терпит неудачу, когда такое условие существует.Динамический 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>'[email protected] +'</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

Вы можете дважды до ваших одинарной кавычки символы в @Narration с использованием ЗАМЕНИТЬ функции. Таким образом, когда вы строите @xmlfragment это может выглядеть следующим образом:

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

Это хорошая идея, но я боялся, любых других предопределенных операторов, которые могут возникнуть на входе. – Rafi

+0

Я не уверен, какие операторы вы имеете в виду (я не мастер XML), но вы можете определенно использовать ту же технику для замены других символов (например, «" и <до ​​< ...) – GilM