消息 102,级别 15,状态 1,第 3 行“”附近的语法不正确 sp_executesql

Msg 102, Level 15, State 1, Line 3 Incorrect syntax near ' ' with sp_executesql

我正在根据来自几个不同表的操作动态构建 SQL 语句。 SQL 的显着部分如下。

DECLARE @SQL NVARCHAR(MAX) = NULL
...
SELECT @sql = 'TRIM(CAST(' + STRING_AGG(EXPORT_COL, ' AS VARCHAR)) + '','' + TRIM(CAST(') FROM #TEMP_TABLE
SET @sql = 'SELECT''(''+'+@sql+' AS VARCHAR))+'')'''+'FROM '+'[mydatabase].[dbo].['+@TABLENAME+']'
SET @sql = REPLACE(@sql,'''','''''')

当我使用 sp_executesql

调用代码时
EXEC sp_executesql @sql

我收到这个错误

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ''

如果我在 SSMS 中查询 @sql 或将值打印到消息 window,我得到:

SELECT''(''+TRIM(CAST(COL1 AS VARCHAR)) + '','' + TRIM(CAST(COL2 AS VARCHAR))+'')''FROM [mydatabase].[dbo].[DATA_TABLE] 

这是我期望的输出。

复制文本并使用带引号的输出字符串调用 sp_executesql,查询成功且没有错误。

EXEC sp_executesql N'SELECT''(''+TRIM(CAST(COL1 AS VARCHAR)) + '','' + TRIM(CAST(COL2 AS VARCHAR))+'')''FROM [mydatabase].[dbo].[DATA_TABLE]'

我已经检查过是否存在不可打印字符,如此 post

我还实现了一个功能,该功能“应该”根据此 删除任何不可打印的字符。然而问题依旧。

SQL Windows Server 2019 标准上的 Server 2017 Express (v14.0.1000.169)。

您需要非常注意何时以及哪些部分需要单引号,哪些部分需要双引号。

如果您正在编写字符串以将其分配给变量,则需要双引号。但是,如果字符串中已经包含引号,则不需要再次加倍。

这是一个显示 issues/approach

的简化示例
CREATE TABLE #Test (TestVal varchar(100));
INSERT INTO #Test (TestVal) VALUES ('abcde');

现在,当 运行 使用双引号(类似于您的)的过程时,结果如下

DECLARE @SQL2 nvarchar(max) = 'SELECT ''''('''' + TestVal + '''')'''' FROM #Test;'
PRINT @SQL2;
/* -- Result
SELECT ''('' + TestVal + '')'' FROM #Test;
*/

EXEC sp_executesql @SQL2;
/* -- Result
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near ''.
*/

EXEC sp_executesql N'SELECT ''('' + TestVal + '')'' FROM #Test;';
/* -- Result
(abcde)
*/

请注意,在底部命令中,需要双引号,以便字符串包含单引号 - 因此有效。但是,当已经在字符串中时,它会使命令失败。

现在,如果我们让变量只有单引号,就可以了

DECLARE @SQL3 nvarchar(max) = 'SELECT ''('' + TestVal + '')'' FROM #Test;'
PRINT @SQL3;
/* -- Result
SELECT '(' + TestVal + ')' FROM #Test;
*/

EXEC sp_executesql @SQL3;
/* -- Result
(abcde)
*/