2014-05-23 92 views
-1

所以這很奇怪,我在這個SQL位中聲明瞭一個臨時表,但是我只是基於if else邏輯聲明它。在運行下面的查詢之前,我正在刪除臨時表,並且仍然得到相同的行爲。SQL Server臨時表已存在?

但是,SQL Server與There is already an object named '#ManifestTrackingBranches' in the database. complaing,當我試圖用我的ReportType集運行查詢到2

我在這裏失去了一些東西?如果其中ReportType被設置爲2,並且我試圖選擇到同一個臨時表的第二發生

T-SQL

declare @ReportType int 
declare @CustomerNumber int 
declare @StartDate datetime 
declare @EndDate datetime 

set @ReportType = 2 
set @CustomerNumber = 81 
set @StartDate = '2014-04-27' 
set @EndDate = '2014-05-04' 

if @CustomerNumber = 81 
begin 
    if @ReportType = 1 -- roll up by location 
    begin 
     select InboundData.Tracking, 
       InboundData.NegotiatedRate 
     into #ManifestTrackingBranches 
     from InboundData 
     where Injected >= @StartDate and Injected <= @EndDate 

     -- Match tracking numbers against Ebill Data 
     select  #ManifestTrackingBranches.Tracking, 
        SUM(isnull(cast(#ManifestTrackingBranches.NegotiatedRate as decimal(18,2)),0)) as ManifestAmount 
     from  EBillData 
     group by #ManifestTrackingBranches.Branch 
    end 

    else if @ReportType = 2 -- Line Item Reports 
    begin 
     select InboundData.Tracking, 
       InboundData.NegotiatedRate 
     into #ManifestTrackingBranches 
     from InboundData 
     where Injected >= @StartDate and Injected <= @EndDate 

     -- Match tracking numbers against Ebill Data 
     select  #ManifestTrackingBranches.Tracking, 
        SUM(isnull(cast(#ManifestTrackingBranches.NegotiatedRate as decimal(18,2)),0)) as ManifestAmount 
     from  EBillData 
    end 
end 

該錯誤。

+2

在開始創建臨時表或使用不同的表名。確定哪些名稱已在批處理中聲明時,T-SQL不注意控制流。 –

+0

@Damien_The_Unbeliever這工作,在邏輯之前創建臨時表。感謝您的解釋!如果你寫這個答案,我會很樂意接受它 – mituw16

+0

你也可以使用表變量。 – podiluska

回答

5

在任何變量聲明之前添加這行代碼。

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

將只具有影響,如果這種說法是在一個單獨的批次,使用GO關鍵詞。當你實際編寫你的過程並再次執行它再測試代碼時足夠好。

在您的過程中,您無法添加關鍵字GO,並且在從應用程序調用此過程時,不需要刪除表。對此過程的每次調用都將擁有自己的連接,並將創建一個僅限於該連接範圍的臨時表。

+1

測試過,這沒有幫助....我認爲@Damien_The_Unbeliever是正確的。 Tsql不關心控制流。 – Darka

+0

是的,我沒有在發佈的代碼中包含該代碼,但是我確實已經將其放在腳本的頂部。不改變任何東西 – mituw16

+0

是的,它需要在一個單獨的批次,您需要在測試時添加關鍵詞「GO」。你不能在你的程序中添加'GO'。但是當你的應用程序調用這個過程時,這不會是任何問題。您甚至不需要添加drop table語句,因爲對該過程的每個調用都將擁有自己的連接,並將創建一個僅限於該連接範圍的臨時表。 –

0

SQL將保留每個連接的臨時表,除非您放棄它們。因此,一旦完成使用,放棄臨時表是一個不錯的主意。

添加DROP TABLE語句

declare @ReportType int 
declare @CustomerNumber int 
declare @StartDate datetime 
declare @EndDate datetime 

set @ReportType = 2 
set @CustomerNumber = 81 
set @StartDate = '2014-04-27' 
set @EndDate = '2014-05-04' 

if @CustomerNumber = 81 
begin 
    if @ReportType = 1 -- roll up by location 
    begin 
    select InboundData.Tracking, 
      InboundData.NegotiatedRate 
    into #ManifestTrackingBranches 
    from InboundData 
    where Injected >= @StartDate and Injected <= @EndDate 

    -- Match tracking numbers against Ebill Data 
    select  #ManifestTrackingBranches.Tracking, 
       SUM(isnull(cast(#ManifestTrackingBranches.NegotiatedRate as decimal(18,2)),0)) as ManifestAmount 
    from  EBillData 
    group by #ManifestTrackingBranches.Branch; 

    --clean up after yourself 
    drop table #ManifestTrackingBranches 
    end 

    else if @ReportType = 2 -- Line Item Reports 
    begin 
    select InboundData.Tracking, 
      InboundData.NegotiatedRate 
    into #ManifestTrackingBranches 
    from InboundData 
    where Injected >= @StartDate and Injected <= @EndDate 

    -- Match tracking numbers against Ebill Data 
    select  #ManifestTrackingBranches.Tracking, 
       SUM(isnull(cast(#ManifestTrackingBranches.NegotiatedRate as decimal(18,2)),0)) as ManifestAmount 
    from  EBillData 

    --clean up after yourself 
    drop table #ManifestTrackingBranches 
    end 
end 
+0

不幸的是,這並沒有奏效。它仍然給出相同的錯誤 – mituw16

+0

是的。達米恩是對的。但是,明確刪除臨時表還是一個好主意。通常它並不重要,但之前我被它燒了。特別是在調試時等。 – tgolisch