我收到错误:消息2714,级别16,状态1,行16 数据库中已经有一个名为“#mytemptable”的对象。
有很多方法,但想知道为什么会这样。好像SQL Server正在验证if / else语句的两个块?
declare @choice int
select @choice = 1
if @choice = 1
begin
select 'MyValue = 1' AS Pick into #my_temp_table
end
else
begin
select 'MyValue <> 1' AS Pick into #my_temp_table
end
select * from #my_temp_table
drop table #my_temp_table
如果表格名称不同,则可以使用。或者,如果我创建临时表并使用Insert Into ...语句也可以。
答案 0 :(得分:4)
见这里:What is deferred name resolution and why do you need to care?
基本上你需要先停止表格
所以发生的事情是从SQL Server 7开始,对真实表启用延迟名称解析,但不为临时表启用延迟名称解析。如果您更改代码以使用真实表而不是临时表,则不会有任何问题
这是另一种方式
declare @choice int
select @choice = 1
declare @Value varchar(100)
if @choice = 1
select @Value = 'MyValue = 1'
else
select @Value = 'MyValue <> 1'
select @Value AS Pick into #my_temp_table
select * from #my_temp_table
drop table #my_temp_table
答案 1 :(得分:1)
试试这个:
declare @choice int
select @choice = 1
CREATE TABLE #my_temp_table(
Pick varchar(25)
)
if @choice = 1
begin
INSERT INTO #my_temp_table
select 'MyValue = 1'
end
else
begin
INSERT INTO #my_temp_table
select 'MyValue <> 1'
end
select * from #temptable
drop table #temptable
编辑抱歉,我看到你试过这个,问题是为什么会发生这种情况。这是因为SQL Server在创建存储过程时会对其进行解析并检查命名冲突。