字符串 ')' 后的非封闭引号 - OPENQUERY

xXx*_*xXx 4 t-sql sql-server

我有以下查询,执行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
Run Code Online (Sandbox Code Playgroud)

当我执行时,出现以下错误:

消息 102,级别 15,状态 1,第 4 行 ')' 附近的语法不正确。消息 105,级别 15,状态 1,第 5 行 字符串 ')' 后的非封闭引号。

Vah*_*ian 5

如果打印该@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
Run Code Online (Sandbox Code Playgroud)

您将得到以下结果:

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

现在很清楚为什么 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
Run Code Online (Sandbox Code Playgroud)

上述查询将产生:

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

SELECT  CONCAT(CONCAT([Firstname],''),[Lastname]) AS [Owner]
       FROM [XXX].[dbo].[Employee] ')
Run Code Online (Sandbox Code Playgroud)

您现在可以简单地替换PrintEXECUTE命令并执行它!

  • @AmiraBedhiafi Vahid 为您提供了解决方案的想法,但在代码中留下了一些错误。在第三行中,您将需要 '''' 而不是 '',在第四行中您还需要 '''' 而不是 ''。在第二行中,我们有另一个错误,这是一个逻辑错误,您需要 '''' 而不是 '' '' 来获得空字符串而不是空格。 (2认同)