sql-server - SQL Server 语法失败
问题描述
我正在运行以下代码,并且在“.TableReference”错误附近出现语法错误,该代码可以正常工作,然后我做了一些事情,现在我遇到了这个错误,我似乎找不到问题
通过故障排除,我已将代码问题缩小到该' FROM ' + @TableName
部分,但它似乎是很好的代码。
BEGIN
--SET NOCOUNT ON;
DECLARE @TableName AS NVARCHAR(MAX) --The Fully qualified database name
DECLARE @Ref AS NVARCHAR(MAX) --The name of the Table we are processing
DECLARE @TempTab AS NVARCHAR(MAX) --the temporary table we are subjecting to the tortures of this process
DECLARE @TempQuery AS NVARCHAR(MAX) --Query to move all data into the temporary table
--This selects the first record in the Website Request Table which hasn't been processed and passes it into the TempTab variable
SET @NDTRef = (SELECT TOP 1 Reference from dbo.WebRequestTable Where Processing IS NULL)
SET @TableName = 'Processing.dbo.'+@NDTRef
Set @TempTab = 'TEMP' + @NDTRef
SET @TempQuery = 'SELECT * INTO '+ @TempTab +' FROM ' + @TableName
EXEC sp_sqlexec @TempQuery;
END
任何帮助将不胜感激,它是 SQL Server 2019 的独立实例,代码是存储过程的一部分,但其余代码运行在此块中创建的临时表
在提出建议后,我在直接放置后输入了关于 @TempQuery 的打印语句,并且 EXEC 删除了输出是
SELECT * INTO TEMP2294690 FROM Processing.dbo.2294690
随着 EXEC 的回归,我得到了错误
消息 102,级别 15,状态 1,第 17 行“.2294690”附近的语法不正确。
EXEC 后的打印输出显示:
SELECT * INTO TEMP2294690 FROM Processing.dbo.2294690
数据库中存在表 2294690 处理 Temp2294690 是一个应该由该块创建的表,但它没有被创建
解决方案
在 SQL Server 中,常规标识符_
必须以字母、下划线 ( )、at 符号 ( @
) 或数字 sigh ( )开头#
。
(还有其他规则,但这是与问题相关的规则......)
不符合常规标识符规则的标识符,只有用方括号 ( []
) 或双引号 ( "
) 括起来才能使用。
在创建动态 SQL 语句时处理标识符的最佳方法是使用内置QUOTENAME
函数 - 这样即使标识符不遵循常规标识符的规则,您也可以确保查询不会中断。
所以你的 SQL 应该是这样的:
SET @TableName = '[Processing].[dbo].'+ QUOTENAME(@NDTRef)
SET @TempTab = 'TEMP' + @NDTRef
SET @TempQuery = 'SELECT * INTO '+ QUOTENAME(@TempTab) +' FROM ' + @TableName
话虽如此,您还应该查看我的博客文章,标题为 SQL Server 的动态 SQL 的注意事项,您可以在其中找到有关如何安全地创建动态 SQL 的更多信息。
推荐阅读
- matlab - 如何在 3D 空间中找到三角形每个顶点的法线向量?
- python - 如何从 Excel 工作表中提取日期?
- sql - 从关系中获取错误数据
- git - 变基如何在非快进合并中模拟快进?
- python - 如何在烧瓶服务器上检查现有用户的 sql 数据库
- sql - 在 presto sql 中创建 bin - 以编程方式
- excel - VBA宏,按字母顺序对列进行排序,后面有行,如何?
- typescript - 打字稿、复杂对象和联合类型
- reactjs - React 仅针对具有省略号的文本显示 Material-UI 工具提示
- directus - 无法在 Directus 中访问用户令牌