3
IF OBJECT_ID('tempdb..#iftry') IS NOT NULL 
DROP TABLE #iftry

IF OBJECT_ID('BIC_Analytics.dbo.AdjudicateAllDCCharteredClaims') IS  NULL
begin
select 'this is start of first block'
 SELECT 'this is first block' as blockid
 INTO #iftry
select 'this is end of first block'
end

ELSE

begin
select 'this is start of 2nd block'
 SELECT 'this is 2nd block' as blockid
    INTO #iftry
select 'this is end of 2nd block'
end

select ':)'

select * from #iftry

私にエラーを与え続けます:

Msg 2714, Level 16, State 1, Line 18
There is already an object named '#iftry' in the database.

今それは動作します

IF OBJECT_ID('tempdb..#iftry') IS NOT NULL 
DROP TABLE #iftry

create table #iftry (blockid varchar(20))


IF OBJECT_ID('BIC_Analytics.dbo.AdjudicateAllDCCharteredClaims') IS NOT NULL
begin
--select 'this is start of first block'
 insert into #iftry (blockid)
 select 'this is first block' 
--select 'this is end of first block'
end

ELSE

begin
--select 'this is start of 2nd block'
 insert into #iftry (blockid)
 select 'this is 2nd block' 
--select 'this is end of 2nd block'
end

select ':)'

select * from #iftry
4

1 に答える 1

4

これは解析の問題であり、実行時の問題ではありません。SQL Serverは、到達できない2つのコードパスがあることを認識できません。

これを回避するには、事前に#tempテーブルを作成します。

SELECT 'bogus' INTO #iftry
  WHERE 1 = 0; -- creates empty table

IF ...
  INSERT #iftry ...
ELSE ...
  INSERT #iftry ...

2つの#table宣言を別々のバッチに配置するか(実際には実行できません)、動的SQLを構築してそのスコープで#tempテーブルを操作しない限り(楽しくない)、SQLServerにこのように機能しないように指示する方法はありません。 )。

于 2012-09-13T14:34:55.097 に答える