2012-06-20 43 views
0

以下两个临时表,但不同的结构是我的逻辑是应该做的如何使用相同名称

IF @id = 1 
BEGIN 
    SELECT * INTO #abc from table1 
END 

IF @id = 2 
BEGIN 
    SELECT * INTO #abc frm table2 
END 

然而,当我执行我的发言我得到的错误说

已经有一个名为#abc的对象..

有什么建议可以解决这个错误吗?

+1

我已经清理了问题,所以只用你的错误消息的原因涉及。我相信您的流程的其他部分应该得到一些真正的关注,但您可以分别处理这些问题。 –

+0

谢谢,亚伦! – rock

回答

0

另一种可能的解决方案:

CREATE TABLE #abc (
--put schema here 
) 

IF @id = 1 
BEGIN 
    insert into #abc 
    select * from table1 
END 

IF @id = 2 
BEGIN 
    insert into #abc 
    select * from table2 
END 

select * from #abc 

drop table #abc; 

你总是应该使用的列名,而不是*因为它在性能方面更好。

而且,select *会查找当前表中的所有列,表格结构中的更改(如添加,删除或重命名列)会自动修改select *的结果。单独列出列可让您更精确地控制结果。

+0

“DROP”没有帮助。执行和解析产生一个对象已经存在错误。 –

+0

@AaronBertrand编辑! –

+0

@aF完全同意你..我故意使用*因为我有太多的列名隐喻! – rock

3

你不能。解析器不理解您的逻辑IF,并且它将SELECT INTO语句视为将发生的事情。

你应该做的是:

IF @id = 1 
BEGIN 
SELECT * INTO #abc1 from table1 
END 

IF @id = 2 
BEGIN 
SELECT * INTO #abc2 frm table2 
END 

IF @id = 1 
    SELECT * FROM #abc1; 
ELSE 
    SELECT * FROM #abc2; 

毕竟,你需要知道,在#temp表,以做任何有意义与它不同的栏目,对不对?

(或避免临时表干脆。)

+0

这只能工作,直到选择INTO#abc1或abc2的东西..正如我在我的问题中提到,我必须把结果(意思#abc1或#abc2)INTO# GrandTotal ..你的逻辑会给我两个#GrandTotal,这将再次抛出我相同的错误 – rock

+0

@ranjith我不明白这个问题。如果#GrandTotal总是SUM(numeric_column),varchar_column'的结果,为什么它必须改变?你唯一需要改变的是你是否从#abc1或#abc2中插入总数。如果列是不同的,并且你的查询必须反映出来,我完全不知道你从命名原来的表得到了什么。如果你展示你的*整个*脚本,而不仅仅是导致错误的部分,你可能会得到更多有用的信息,以便如何以正确的方式做到这一点,而不是你已经决定完成的方式。 –

+0

由于大小限制,我无法在这里添加整个脚本..是否有任何其他方式..即时通讯对不起,我新到了stackoverflow .. – rock

相关问题