Когда я столкнулся с этой трудностью несколько месяцев назад, я создал функцию, которая выполняла бы двойные кавычки для динамического SQL. Вместо того, чтобы искать строку каждый раз вручную, чтобы найти кавычки, которые нужно удвоить, эта скалярная функция может выполнить эту задачу. Это может предотвратить потенциальное загромождение сценария при выполнении будущих изменений, например, добавление дополнительных переменных, а также улучшение читабельности.
Функция работает следующим образом:
CREATE FUNCTION dbo.fn_duplicateQuotes
(@string varchar(max),
@level int)
RETURNS varchar(max)
AS
BEGIN
/*Doubles-up quotation marks for nested dynamic SQL
level can be set greater than 1 to add additional doubled-up quotes
for further nested dynamic SQL*/
/*Double up quotes*/
set @string = REPLACE(@string, '''', REPLICATE('''', (@level) * 2))
/*Return Value*/
return @string
END
Динамический SQL следующим образом:
declare @SQL nvarchar(max)
declare @LetterID varchar(max) = 'c01as1'
set @SQL = 'SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode =
''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\' + @LetterID + '.csv''
WITH RESULT SETS (tency_seq_no VARCHAR(255));'
set @SQL = 'SELECT fltr.tency_seq_no FROM OPENQUERY(loopback,
''' + dbo.fn_duplicateQuotes(@SQL, 1) + '''
) AS fltr'
print @SQL
exec (@SQL)
Печать @SQL возвращает:
SELECT fltr.tency_seq_no FROM OPENQUERY(loopback,
'SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode =
''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\c01as1.csv''
WITH RESULT SETS (tency_seq_no VARCHAR(255));'
) AS fltr