sql-server - 消息102,级别15,状态1,第3行带有sp_executesql的 ' '附近的语法不正确

标签 sql-server syntax-error ssms

我正在基于来自几个不同表的操作动态构建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 ''


如果我查询@sql或将值打印到SSMS的消息窗口中,则会得到:
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中指示的不可打印字符的存在
我还实现了一个功能,“应该”根据此post去除所有不可打印的字符。但是问题仍然存在。
Windows Server 2019标准上的SQL Server 2017 Express(v14.0.1000.169)。

最佳答案

您需要非常小心何时以及哪些部分需要单引号以及哪些部分需要双引号。
如果要编写字符串以将其分配给变量,则需要双引号。但是,如果字符串中已包含引号,则无需再次将其加倍。
这是显示问题/方法的简化示例

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-server - 消息102,级别15,状态1,第3行带有sp_executesql的 ' '附近的语法不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64867163/

相关文章:

sql - 在 SQL Server 实例中存储数据库的多个版本的最合乎逻辑的方法是什么?

c# - 数据库表为空时如何从数据库中获取最大ID?

sql-server - 如何复制表格和数据以进行测试

sql-server - SQL Server 模板 - 如何转义小于字符?

sql-server - 数据库中已经有一个名为 '#xxxx' 的对象

sql-server - 无法作为本地主机连接到 MSSQL 服务器管理工​​作室

sql - SQL 中 C 风格的最小/最大?

sql - plpgsql中case语句的返回值

mysql - mysql建表时出现1064语法错误

MySQL 错误 1064 单列表