字符串')'后的右引号-OPENQUERY

时间:2019-06-17 08:29:18

标签: sql-server tsql

我有以下用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行')'附近的语法不正确。消息105,   级别15,状态1,第5行字符后的右引号   字符串')'。

2 个答案:

答案 0 :(得分:4)

如果打印@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命令并执行它!

答案 1 :(得分:3)

您没有在转义字符串引号。

如果要在字符串中包含',则必须两次写入''

例如,CONCAT([Firstname],'')必须为CONCAT([Firstname],'''')

请参见How do I escape a single quote in SQL Server?

PS:和@TT。已经评论过,在这种情况下,您可能需要在openquery范围内重新转义引号,因为openquery会再次转义它们。

所以CONCAT([Firstname],'')实际上必须是CONCAT([Firstname],'''''''')