【问题标题】:Unclosed quotation mark after the character string ')' - OPENQUERY字符串 ')' 后的非闭合引号 - OPENQUERY
【发布时间】:2019-06-17 08:29:18
【问题描述】:

我有以下查询,使用 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 行字符后的非闭合引号 字符串')'。

【问题讨论】:

  • 您能否在EXECUTE 之前添加PRINT @QUERY; 并检查呈现的查询是否存在单引号问题。

标签: sql-server tsql


【解决方案1】:

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

【讨论】:

  • 按照您的回答一步一步后仍然出现此错误:'),[Lastname]) AS [Owner] FROM [XXX].[dbo].[Employee] '附近的语法不正确
  • @AmiraBedhiafi Vahid 为您提供了解决方案的想法,但在代码中留下了一些错误。在第三行你需要''''而不是'',在第四行你还需要''''而不是''。在第二行中,我们有另一个错误,这是一个逻辑错误,您需要 '''' 而不是 '' '' 才能有空字符串而不是空格。
  • @AmiraBedhiafi 我已经更新了答案,但它不起作用!
  • @LajosArpad 感谢您的详细说明
【解决方案2】:

你没有转义你的字符串引号。

如果你想在一个字符串中包含一个',你必须写两次''

因此,例如,CONCAT([Firstname],'') 必须是 CONCAT([Firstname],'''')

How do I escape a single quote in SQL Server?

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

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

【讨论】:

  • 不确定,但它甚至可能需要CONCAT([Firstname],'''''''')。有时会变得很棘手......
  • 正如对原始问题的评论,尝试打印@query,以便您看到将要执行的确切字符串。
  • @AmiraBedhiafi 作为 TT。说,你需要两次转义你的引号,因为 openquery 也需要它们转义。
  • 生活是不公平的。另一个答案被投了两次,即使它包含错误,而你的答案只被投了一次......
  • @MarcGuillot 另一个赞成票是我的,尽管我在其中发现了一些错误,但总体思路还是不错的。但是那个答案写得比你的晚得多。如果没有正确的完整答案,我将不得不自己写。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多