首页 > 解决方案 > 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-servertsqlstored-procedures

解决方案


在 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 的更多信息。


推荐阅读