【问题标题】:Can't able to create temp table using Dynamic query无法使用动态查询创建临时表
【发布时间】:2019-06-18 20:39:25
【问题描述】:

我正在尝试在 MS sql 服务器中创建一个临时表。它的显示就像创建了表并插入了值。使用 Select 查询时,会引发错误。

我的示例代码是

EXEC (
        'create table #temp2 (id int)
         insert #temp2 values(1)'
        )

SELECT *
FROM #temp2

输出是

(受影响的 1 行)
消息 208,第 16 级,状态 0,第 8 行
无效的对象名称“#temp2”。

【问题讨论】:

  • 临时表只存在,只能在创建它的会话中被引用;您不能使用EXEC 创建新会话然后引用该表。你为什么在这里使用EXEC?您的查询没有任何动态。
  • EXEC 中创建的临时表在 EXEC 完成时被删除。尽管EXEC 实际上并没有创建新会话,但它确实为临时表创建了一个新的、单独的范围。
  • 感谢您的回复。这是我的示例代码。在我的实际代码中,根据用户的不同,我在不同的列类型中有不同的列数。所以我需要动态创建一个临时表。
  • 那么您唯一的办法就是将所有语句(包括访问表的语句)移到EXEC 中。通常这种代码会变得非常笨拙,您应该强烈考虑完全改变您的方法以消除对动态对象的依赖(例如,您可以使用键值表),或者从客户端代码中执行此操作。
  • Jeroem Mostert,是否有任何解决方案可以创建临时表并在同一会话中使用它?

标签: sql-server dynamic-sql


【解决方案1】:

在同一过程中创建临时表,使其仍在范围内,然后使用动态 SQL 对其进行修改。

create table #temp2 (id int) 

DECLARE @SQL NVARCHAR(1000) ='ALTER TABLE #temp2 ADD test1 int NOT NULL, test2 int NOT NULL'

EXEC sp_executesql @SQL

insert #temp2 values(1,2,3)

SELECT * FROM #temp2

DROP TABLE #temp2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多