sql-server – 在IF ELSE语句中删除临时表
我在这里遇到了僵局,问题是我必须改变一个使用3个不同临时表的过程.让我们为了对话,将它们命名为#temptable1,#temptable2,#temptable3.
create table #temptable1 然后使用select / into语句创建剩下的两个 select T.Col,T.Col2,T.Col3 into #temptable2 from table1 T where T.BB>0 select T.Col,T.Col3 into #temptable3 from table2 T where T.BB>0 drop table #temptable1 drop table #temptable2 drop table #temptable3 在此之前它工作正常,但我想要做的是通过添加if / else语句来改变过程.因此,看起来像那样, declare @BBB nvarchar(32) create table #temptable1 if @BBB='dd' begin select T.Col,T.Col3 into #temptable2 from table1 T where T.BB>0 and T.G='FDL' select T.Col,T.Col3 into #temptable3 from table2 T where T.BB>0 and T.G='FDL' drop table #temptable1 drop table #temptable2 drop table #temptable3 end if @BBB='kk' begin select T.Col,T.Col3 into #temptable2 from table1 T where T.BB>0 and T.G='FD' select T.Col,T.Col3 into #temptable3 from table2 T where T.BB>0 and T.G='FD' drop table #temptable1 drop table #temptable2 drop table #temptable3 end else begin select T.Col,T.Col3 into #temptable2 from table1 T where T.BB>0 select T.Col,T.Col3 into #temptable3 from table2 T where T.BB>0 drop table #temptable1 drop table #temptable2 drop table #temptable3 end 当我尝试创建新程序时,我收到此消息, Msg 2714,Level 16,State 1,Procedure pPortfoliostest3,Line 412 There is already an object named '#temptable1' in the database. Msg 2714,Line 550 There is already an object named '#temptable2' in the database. Msg 2714,Line 711 There is already an object named '#temptable3' in the database. 这些行指示临时表在第二个if语句中的位置(如果@ BBB =’kk’). 解决方法T-SQL解析器非常原始.特别是,控制流不会影响对象名称何时进入范围并保持在范围内.因此,您在if分支中使用的名称仍在范围内,并在解析else分支时导致冲突. 如果可能,在任何控制流之前将表定义移动到存储过程的顶部,并切换到INSERT … SELECT …而不是SELECT … INTO …;或者如果if和else分支之间的表定义不匹配,则需要为临时表使用不同的名称. 作为解析器原始性的另一个示例,请考虑以下事项: if 1=0 begin declare @a int end select @a 这会生成一个包含null的结果集,而不是(正如您可能预期的那样)一个错误,表示未声明@a. (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |