消息 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)
*/
我正在根据来自几个不同表的操作动态构建 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)
*/