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感谢您的澄清