我有以下用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行字符后的右引号 字符串')'。
答案 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],'''''''')