T-SQL从另一个临时表插入临时表

时间:2013-03-20 02:47:41

标签: sql-server tsql

我试图在程序结束时实现这样的目标,我需要所有的行 一个临时表 我怎样才能完成这个

if @i > 1
begin
select * from into #tempTbl1 from payments
where method = 'test1'
end 
else
begin
select * from into #tempTbl2 from payments
where method = 'test1'
end

insert into #tempTbl1 select * from #tempTbl2

select * from #tempTbl1

2 个答案:

答案 0 :(得分:1)

尽管存在以前的逻辑问​​题,但要简单地从两个临时表中获取所有行,请使用UNION:

select * from #tempTbl1  
UNION ALL  
SELECT * from #tempTbl2  

答案 1 :(得分:0)

你在这里遇到的问题是,基于你的IF / ELSE你将永远不会有两个表。您的最终INSERT INTO要求两个表都存在。在尝试填充之前,您可能需要先在存储过程中创建对象,然后插入表中。

这也引出了一个问题,如果你以后要在#tempTbl1中插入所有东西,这是在SELECT INTO语句中创建的,为什么首先要有#tempTbl2?

create procedure dbo.testing
(@i int)
AS
if @i > 1
    begin
        print 'In condition 1'
        select * 
        into #tempTbl1 
        from payments
        where method = 'test1'
    end 
else
    begin
        print 'In condition 2'
        select * 
        into #tempTbl2 
        from payments
        where method = 'test1'
    end

print 'Made it out of the if else'

insert into #tempTbl1 
select * 
from #tempTbl2

--  Never gets this far...
print 'In the final select'

select * 
from #tempTbl1

如果你致力于这种方法,那么你可能需要检查表是否存在:

IF  EXISTS (SELECT * FROM tempdb.sys.objects WHERE object_id = OBJECT_ID(N'tempdb.dbo.#tempTbl1') AND type in (N'U'))
print 'Table is there'

基于评论更新

根据您的评论,这将有效。您最初发布的SELECT ... INTO语句允许您根据所选列的数据类型创建表,但目标表不能存在。如果您预先定义要插入的结构,则可以评估这两个条件,最后得到一个表作为结果。

(注意 - 我的“付款”表只有两列,“方法”和“col2”。您可能希望在CREATE TABLE和SELECT中指定所需的列

create procedure dbo.testing
(@i int)
AS
create table #tempTbl1
(method varchar(10)
, col2 int)

if @i > 1
    begin
        insert into dbo.#tempTbl1
        select method, col2 
        from payments
        where method = 'test1'
    end 
else
    begin
        insert into dbo.#tempTbl1
        select method, col2 
        from payments
        where method = 'test1'
    end

select * 
from #tempTbl1