【发布时间】:2021-02-28 04:35:39
【问题描述】:
我正在根据来自几个不同表的操作动态构建 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
我收到此错误
消息 102,第 15 级,状态 1,第 1 行
附近的语法不正确
''
如果我查询 @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)。
【问题讨论】:
-
PRINT您的动态 SQL 并首先对其进行调试,然后将解决方案移至动态语句。 -
另外
'['+@TABLENAME+']'是不不安全注射。使用QUOTENAME安全地注入对象名称。 -
@Larnu 这是我在调试期间做的第一件事。动态 SQL 打印复制成功。
-
那么也将它发送到
sys.sp_executesql。花点时间在这里给我们打个minimal reproducible example。
标签: sql-server syntax-error ssms