Количество одинарных кавычек при запуске динамического SQL с переменной - PullRequest
0 голосов
/ 10 января 2019

Мне очень трудно разобраться с числом ', которое я должен иметь в следующем выражении SQL:

declare @sql varchar(max)
declare @LetterID varchar(max) = 'c01as1'
set @sql = 
'SELECT fltr.tency_seq_no FROM OPENQUERY(loopback, 
    ''SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = 
        ''''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\
            '''+@LetterID+'''
        .csv''''
    WITH RESULT SETS (tency_seq_no VARCHAR(255))''
) AS fltr'
exec (@sql)

Текущая ошибка:

Сообщение 102, Уровень 15, Состояние 1, Строка 3
Неверный синтаксис рядом с 'c01as1'

Просто чтобы уточнить, ошибка относится к переменной @LetterID в динамическом 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

Буду признателен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Когда я столкнулся с этой трудностью несколько месяцев назад, я создал функцию, которая выполняла бы двойные кавычки для динамического 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
0 голосов
/ 10 января 2019

Я думаю, что ошибка как-то связана с нежелательными переносами строк и т. Д. В исходном коде. Попробуйте вместо этого:

DECLARE @sql VARCHAR(MAX);
DECLARE @LetterID VARCHAR(MAX) = 'c01as1';

SET @sql = 'SELECT fltr.tency_seq_no FROM OPENQUERY(loopback, 
    ''SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = ''''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\'
           + @LetterID + '.csv''''
    WITH RESULT SETS (tency_seq_no VARCHAR(255))''
) AS fltr';

EXEC (@sql);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...