Sql server 字符串';后的未闭合引号';-OPENQUERY

Sql server 字符串';后的未闭合引号';-OPENQUERY,sql-server,tsql,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_exe

我使用
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
当我执行时,会出现以下错误:

Msg 102,第15级,状态1,第4行“')附近的语法不正确。味精105, 级别15,状态1,第5行字符后未关闭的引号 字符串“')”


您没有转义字符串引号

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

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

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


所以
CONCAT([Firstname],'')实际上必须是
CONCAT([Firstname],'')
如果您打印
@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
命令,然后执行它

可以添加
PRINT@QUERY
在执行
之前执行
,并用单引号问题检查呈现的查询。不确定,但它甚至可能需要是
CONCAT([Firstname],”)
。有时会变得很棘手……正如对原始问题的评论一样,请尝试print@query,这样您将看到它将要执行的确切字符串。@AmiraBedhiafi As TT。你需要两次转义你的引用,因为openquery也需要转义它们。生活是不公平的。另一个答案被提升了两次,尽管它包含bug,而你的答案只被提升了一次…@Marguillot另一个提升是我的,尽管我发现了其中的一些错误,但总体想法是好的。但这个答案写得比你晚得多。如果没有正确的完整答案,我将不得不写我自己的。在一步一步地遵循您的答案后仍然会出现此错误:“,[Lastname]),作为[XXX].[dbo].[Employee].@AmiraBedhiafi Vahid给了您解决方案的想法,但在代码中留下了一些错误。在第三行中,您将需要“”,而不是“”;在第四行中,您也将需要“”,而不是“”。在第二行中,我们有另一个bug,这是一个逻辑bug,您需要用“”而不是“”,以使空字符串而不是空格。@AmiraBedhiafi我已经更新了答案,但它不起作用@LajosArpad感谢您的澄清