【问题标题】:Temporary table not created from dynamic query execution不是从动态查询执行创建的临时表
【发布时间】:2017-02-16 17:41:00
【问题描述】:

如果我运行这个动态查询:

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser'
execute(@test)

然后尝试使用以下命令查询#tmp7

select * from #tmp7

抛出错误:

无效的对象名称“#tmp7”。

但是,如果我手动运行相同的查询:

select * into #tmp7 from bauser

一切正常。创建临时表并填充结果。

为什么它不适用于动态查询执行?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    范围!

    临时表只存在于动态执行查询的范围内 如果你确实想让选择放在动态查询中

    declare @test nvarchar(1000) = 'select * into #tmp7 from bauser
    
    select * from #tmp7'
    execute(@test)
    

    你也可以使用 this 来检查是否存在这样的对象

    select * from sys.sysobjects so where so.name like '%tmp7%'
    

    看到这个类似的问题 SQL Server 2005 and temporary table scope

    编辑

    临时表是一个表,所以是的,您可以添加列、索引等。这些表实际上驻留在 TempDB 数据库中,您甚至可以“找到”它们(可以看到它们带有奇怪的长名称),但它们是在执行您的 EXEC 后销毁。

    也许您的问题是尝试动态方法,或者与您的问题完全无关。尝试发布一个新问题,你得到了什么以及你需要做什么来获得进一步的帮助。

    【讨论】:

    • 感谢您的回答,是的,范围是问题所在。以后有可能以某种方式向#tmp 添加一些列吗?
    【解决方案2】:

    如果您使用动态 SQL 创建临时表,它将无法在动态 SQL 范围之外使用。

    您需要使用动态 SQL 创建它,然后使用 INSERT INTO 填充表。

    -- use this trick to create the temp table easily.
    SELECT * INTO #tmp7
    FROM bauser
    WHERE 1=2
    
    declare @test nvarchar(1000) = 'insert into #tmp7 select * from bauser'
    execute(@test)
    

    【讨论】:

    • 这就是问题所在 - 我有很多动态创建的列。在运行时间之前,我不知道哪些列会在表上。
    • @FrenkyB 如果你真的想走上动态查询的痛苦列车,你可以创建一个查询来创建动态查询,甚至可以创建一个动态查询来创建动态查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多