SQL 中的 IF ELSE 语句错误

error in IF ELSE statement in SQL

我有以下存储过程,但似乎 #Temp table 在其中制造了麻烦。我收到以下错误

There is already an object named '#Temp' in the database.

我猜我的 IF ELSE 有问题

存储过程如下:

create procedure spGetHOSalesReport
@DateFrom datetime,@DateTo datetime,@EmbossLine varchar(20),@CountryID int,@status char(2)     

AS    

Set @DateTo = @DateTo +1    

if(@status = 'E1')
begin

    Select PT.[ID] 'TransactionID', PT.BatchNumber, PT.SequenceNumber, PT.TransactionDate, 
    PT.TerminalID, PT.TotalAmount, PT.TransactionTypeID, TT.TransactionType,PT.PAN 'EmbossLine',PT.PreBalanceAmount, PT.PostBalanceAmount, RefTxnID, SettlementDate,PaidCash, CreditAmount, DiscountAmount,    
    RefPAN, PT.Remarks, '  ' + CashierCard as 'SupervisorCard',St.StoreID    
    into #Temp    
    from TempPOS_Transactions PT inner join TransactionType TT on TT.TransactionTypeID = PT.TransactionTypeID     
    inner join Staff St on St.CardNumber=PT.CashierCard     

    where     

    PT.[ID] not in (Select distinct isnull(TransactionID,0) from Testcards)          
    and (PT.TransactionDate >= @DateFrom) and (PT.TransactionDate < @DateTo)    
    and (PT.TransactionTypeID = 6) and (PT.BatchNumber = 0) and (Pt.SequenceNumber =-1) 



    select T.*, '&nbsp; '+  C.EmbossLine+'&nbsp;' as 'EmbossLine',  C.EmbossLine as 'EmbossLine1',    
    isnull(C.FirstName,'') +' '+ isnull(C.LastName,'') 'EmbossName',C.FirstName,C.LastName,City.CityName,Country.CountryName,Country.CurrencyName, PM.MerchantID, PM.MerchantName1, C.AccountNumber, C.VehicleNumber, C.ExpiryDate ,
    case C.Status when 'E0' then 'Authorized' when 'E1' then 'Pending' end 'Status'   

    from #Temp T     

    inner join Card C on C.EmbossLine= T.EmbossLine    
    inner join Terminal on Terminal.TerminalID = T.TerminalID    
    inner join Merchant PM on  PM.MerchantID = Terminal.MerchantID    
    inner join City on City.CityID = PM.CityID    
    inner join Country on Country.CountryID = PM.CountryID     
    where C.Status <>'E3'    

    and C.CardID not in (Select distinct isnull(CardID,0) from Testcards)    

    and (C.EmbossLine like '%'+@EmbossLine+'%' or @EmbossLine like '-999')      
    and (PM.CountryID = @CountryID or @CountryID ='-999')    

    and (C.Status = @status)    

   order by T.TransactionDate, MerchantName1, T.BatchNumber, T.SequenceNumber    

End

Else
Begin

    Select PT.[ID] 'TransactionID', PT.BatchNumber, PT.SequenceNumber, PT.TransactionDate, 
    PT.TerminalID, PT.TotalAmount, PT.TransactionTypeID, TT.TransactionType,PT.PAN 'EmbossLine',PT.PreBalanceAmount, PT.PostBalanceAmount, RefTxnID, SettlementDate,PaidCash, CreditAmount, DiscountAmount,    
    RefPAN, PT.Remarks, '&nbsp; ' + CashierCard as 'SupervisorCard',St.StoreID    
    into #Temp    
    from POS_Transactions PT inner join TransactionType TT on TT.TransactionTypeID = PT.TransactionTypeID     
    inner join Staff St on St.CardNumber=PT.CashierCard     

    where PT.[ID] not in (Select distinct isnull(TransactionID,0) from Testcards) and (PT.TransactionDate >= @DateFrom) and (PT.TransactionDate < @DateTo)    
    and (PT.TransactionTypeID = 6) and (PT.BatchNumber = 0) and (Pt.SequenceNumber =-1) 

    select T.*, '&nbsp; '+  C.EmbossLine+'&nbsp;' as 'EmbossLine',  C.EmbossLine as 'EmbossLine1',    
    isnull(C.FirstName,'') +' '+ isnull(C.LastName,'') 'EmbossName',C.FirstName,C.LastName,City.CityName,Country.CountryName,Country.CurrencyName, PM.MerchantID, PM.MerchantName1, C.AccountNumber, C.VehicleNumber, C.ExpiryDate ,
    case C.Status when 'E0' then 'Authorized' when 'E1' then 'Pending' end 'Status'   

    from #Temp T     

    inner join Card C on C.EmbossLine= T.EmbossLine    
    inner join Terminal on Terminal.TerminalID = T.TerminalID    
    inner join Merchant PM on  PM.MerchantID = Terminal.MerchantID    
    inner join City on City.CityID = PM.CityID    
    inner join Country on Country.CountryID = PM.CountryID     
    where C.Status <>'E3'    

    and C.CardID not in (Select distinct isnull(CardID,0) from Testcards)    

    and (C.EmbossLine like '%'+@EmbossLine+'%' or @EmbossLine like '-999')      
    and (PM.CountryID = @CountryID or @CountryID ='-999')    

    and (C.Status = @status)    

   order by T.TransactionDate, MerchantName1, T.BatchNumber, T.SequenceNumber    
End 


  drop table #Temp 

同一过程中不能有两个语句创建同名的临时文件 table。这是 SQL 6.5 的遗留物,它没有延迟名称解析。

而且无论如何,只有当 table 的创建完全相同时才有意义,否则您的程序将表现得非常古怪。

所以不要使用 SELECT INTO,而是使用 CREATE TABLE + INSERT

更新
根据评论选择的方式:

Second option: First create temp table and insert

首先让我们创建临时文件 table。为此,您应该像这样修改您的程序:

create procedure spGetHOSalesReport
@DateFrom datetime,@DateTo datetime,@EmbossLine varchar(20),@CountryID int,@status char(2)
AS    
BEGIN -- begin procedure
  SET @DateTo = @DateTo +1

  if object_id('tempdb..#Temp') is not null drop table #Temp
  create table #Temp
  ( TransactionID int
  , BatchNumber ... ( your type of field )
  , SequenceNumber ...
  , TransactionDate ...
  , TerminalID int
  , TotalAmount ...
  , TransactionTypeID int
  , TransactionType ...
  , EmbossLine ...
  , PreBalanceAmount ...
  , PostBalanceAmount ...
  , RefTxnID int
  , SettlementDate ...
  , PaidCash ...
  , CreditAmount ...
  , DiscountAmount ...
  , RefPAN ...
  , Remarks ...
  , SupervisorCard ...
  , StoreID int
  )
  if(@status = 'E1')
  .......

我不知道哪种数据类型有这些字段,所以,你必须自己做。
然后在第一种情况下编辑插入到临时 table 中,在另一种情况下类似:

    insert into #Temp
    Select PT.[ID] 'TransactionID', PT.BatchNumber, PT.SequenceNumber, PT.TransactionDate, 
    PT.TerminalID, PT.TotalAmount, PT.TransactionTypeID, TT.TransactionType,PT.PAN 'EmbossLine',PT.PreBalanceAmount, PT.PostBalanceAmount, RefTxnID, SettlementDate,PaidCash, CreditAmount, DiscountAmount,    
    RefPAN, PT.Remarks, '&nbsp; ' + CashierCard as 'SupervisorCard',St.StoreID    
    from TempPOS_Transactions PT inner join TransactionType TT on TT.TransactionTypeID = PT.TransactionTypeID     
    inner join Staff St on St.CardNumber=PT.CashierCard     
    where ...

在程序的最后你可以添加:

End -- end of your if
if object_id('tempdb..#Temp') is not null drop table #Temp
END -- end of procedure

但最简单的方法是创建两个不同的温度 tables:

if(@status = 'E1')
begin        
  if object_id('tempdb..#Temp1') is not null drop table #Temp1
  Select PT.[ID] 'TransactionID', PT.BatchNumber, ...   
  into #Temp1    
  from TempPOS_Transactions PT 
  inner join TransactionType TT on TT.TransactionTypeID = PT.TransactionTypeID             
  .....     
end
else 
begin
  if object_id('tempdb..#Temp2') is not null drop table #Temp2
  Select PT.[ID] 'TransactionID', PT.BatchNumber, ...
  into #Temp2    
  from POS_Transactions PT 
  inner join TransactionType TT on TT.TransactionTypeID = PT.TransactionTypeID           
  ....
end

此外,在这种情况下,您可以只写两个 select 而无需创建临时 table