我试图在程序结束时实现这样的目标,我需要所有的行 一个临时表 我怎样才能完成这个
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
答案 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