当我运行以下代码时,出现“无效对象名称”错误,任何想法为什么?
我需要创建一个动态命名的临时表,以便在存储过程中使用。
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
谢谢!
答案 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;