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