SQL中IF ELSE语句中的错误

时间:2015-09-17 10:38:19

标签: sql sql-server if-statement runtime-error

我有以下存储过程,但似乎#Temp表正在创建麻烦。我收到以下错误

  

已经有一个名为'#Temp'在数据库中。

我想我的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 

1 个答案:

答案 0 :(得分:1)

在创建具有相同名称的临时表的相同过程中,不能有两个语句。这是SQL 6.5的剩余部分,它没有延迟的名称解析。

在任何情况下,只有表格创建完全相同才有意义,否则你的程序会表现得非常时髦。

因此,不要使用SELECT INTO,而是使用CREATE TABLE + INSERT

<强>更新
根据评论中选择的方式:

  

第二个选项:首先创建临时表并插入

首先让我们创建临时表。为此你应该修改你的程序,如:

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')
  .......

我不知道哪些数据类型包含这些字段,因此,您必须自己完成。
然后在第一种情况下编辑插入临时表,在另一种情况下编辑类似:

    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

但最简单的方法是创建两个不同的临时表:

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而无需创建临时表