动态命名的临时表在存储过程中引用时返回“无效对象名称”

时间:2012-05-02 15:42:42

标签: sql-server sql-server-2008 tsql

当我运行以下代码时,出现“无效对象名称”错误,任何想法为什么?

我需要创建一个动态命名的临时表,以便在存储过程中使用。

 DECLARE @SQL NVARCHAR(MAX)
 DECLARE @SessionID NVARCHAR(50)
 SET @SessionID = 'tmp5l7g9q3l1h1n5s4k9k7e'
 ;
 SET        
 @SQL = N'      CREATE TABLE #' + @SessionID + ' ' +
         N'     (' +
    N'      CustomerNo NVARCHAR(5), ' +
    N'      Product NVARCHAR(3), ' + 
    N'      Gross DECIMAL(18,8) ' +
    N'      )'
 ;
 EXECUTE sp_executesql @SQL
 ;
 SET        
 @SQL = N'      SELECT * FROM #' + @SessionID
 ;
 EXECUTE sp_executesql @SQL

谢谢!

3 个答案:

答案 0 :(得分:3)

为何与这些名字保持联系?让SQL Server为您管理:

Temporary Tables in SQL Server

来自以上链接:

  

如果同一例程由多个进程同时执行,   数据库引擎需要能够区分   同名的本地临时表由不同的创建   流程。它通过向每个本地添加数字字符串来完成此操作   临时表名由左下角字符左边填充。虽然   你指定短名称,如#MyTempTable,实际上是什么   存储在TempDB中的是由CREATE中指定的表名组成   TABLE语句和后缀。因为这个后缀,本地   临时表名称不得超过116个字符。

     

如果您对查看正在发生的事情感兴趣,可以查看   TempDB中的表与您使用任何其他表的方式相同。您可以   甚至只有在调用临时表时才使用sp_help工作   TempDB的。

USE TempDB
go
execute sp_Help #mytemp 
  

或者您可以在TempDB的系统视图中找到它们而不进行切换   数据库。

SELECT name, create_date FROM TempDB.sys.tables WHERE name LIKE '#%'

答案 1 :(得分:1)

你做错了!

尝试:

exec(@SQL)

而不是:

EXECUTE sp_executesql @SQL

要使用sp_executesql,变量必须在@SessionID引号内,并且必须提供输入参数。查看this以获取完整示例!


您应该知道动态SQL是SQL注入的好端口!

答案 2 :(得分:1)

此语法有效

CREATE TABLE #SessionID (CustomerNo NVARCHAR(5),  Product NVARCHAR(3),  Gross DECIMAL(18,8));
Select COUNT(*) from #SessionID;
Drop Table #SessionID;