Незакрытая кавычка после символьной строки ')' - OPENQUERY - PullRequest
2 голосов
/ 17 июня 2019

У меня есть следующий запрос, выполненный с OPENQUERY:

    DECLARE @DOMAIN NVARCHAR = N'XXX';
    DECLARE @QUERY NVARCHAR(MAX)= '
    SELECT * FROM OPENQUERY( [XX\XX],''

    SELECT  CONCAT(CONCAT([Firstname],''),[Lastname]) AS [Owner]
           FROM [Employee] '')'

           EXECUTE XX_executesql @QUERY

При выполнении я получаю следующую ошибку:

Сообщение 102, уровень 15, состояние 1, строка 4 Неверный синтаксис рядом с ')'. Msg 105, Уровень 15, Состояние 1, Строка 5 Незакрытая кавычка после символа строка ')'.

Ответы [ 2 ]

4 голосов
/ 17 июня 2019

Если вы напечатаете значение @Query, вы увидите корень ошибки. Так что, если вы запустите следующий код:

DECLARE @DOMAIN NVARCHAR = N'XXX';
    DECLARE @QUERY NVARCHAR(MAX)= '
    SELECT * FROM OPENQUERY( [XX\XX],''
    SELECT  CONCAT(CONCAT([Firstname],''),[Lastname]) AS [Owner]
           FROM [XXX].[dbo].[Employee] '')'

PRINT @QUERY

Вы получите следующий результат:

SELECT * FROM OPENQUERY( [XX\XX],'
SELECT  CONCAT(CONCAT([Firstname],'),[Lastname]) AS [Owner]
       FROM [XXX].[dbo].[Employee] ')

Теперь понятно, почему SQL Server возвращает

Незакрытая кавычка после ..

Чтобы решить эту проблему, вам нужно помнить, что для того, чтобы в выводе строковой переменной была одинарная кавычка, нужно поставить две одинарные кавычки.

Теперь вам нужно переписать его, как показано ниже:

DECLARE @DOMAIN NVARCHAR = N'XXX';
DECLARE @QUERY NVARCHAR(MAX)= '
SELECT * FROM OPENQUERY( [XX\XX],''

SELECT  CONCAT(CONCAT([Firstname],''''),[Lastname]) AS [Owner]
       FROM [XXX].[dbo].[Employee] '')'

PRINT @QUERY

вышеупомянутый запрос выдаст:

SELECT * FROM OPENQUERY( [XX\XX],'

SELECT  CONCAT(CONCAT([Firstname],''),[Lastname]) AS [Owner]
       FROM [XXX].[dbo].[Employee] ')

Теперь вы можете просто заменить Print на команду EXECUTE и выполнить ее!

3 голосов
/ 17 июня 2019

Вы не экранируете свои строковые кавычки.

Если вы хотите включить ' в строку, вы должны написать ее дважды ''

Так, например,CONCAT([Firstname],'') должно быть CONCAT([Firstname],'''')

См. Как избежать одиночной кавычки в SQL Server?

PS: И как @TT.прокомментировал, что в этом случае вам, вероятно, потребуется повторно экранировать ваши кавычки внутри области действия openquery, потому что openquery снова их ускользнет.

Так что CONCAT([Firstname],'') фактически должно быть CONCAT([Firstname],'''''''')

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