2013-01-15 87 views
4

我想從不同的表中選擇值並將其插入到臨時表中。SQL Server存儲過程創建臨時表和插入值

我需要臨時表中的標識字段。當我嘗試執行下面的代碼,它拋出一個錯誤:

*Msg 2714, Level 16, State 1, Procedure SelectCashDetails, Line 27
There is already an object named '#ivmy_cash_temp1' in the database.*

我試圖改變臨時表爲不同的名字,它拋出了同樣的錯誤,即使之後。

這是我的代碼:

ALTER PROCEDURE [dbo].[SelectCashDetails] 
(
    @trustcompanyid BigInt, 
    @trustaccountid BigInt, 
    @planid BigInt, 
    @fromdate varchar(20), 
    @todate varchar(20), 
    @movetype varchar(20), 
    @typedesc varchar(20) 
) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    CREATE TABLE #ivmy_cash_temp1   
    (tmovedate datetime,   
     tmovedesc varchar(20),  
     tmoneymovetype varchar(20), 
     tplanbal decimal(18,6),   
     tsourcetype BigInt,   
     tdestinationtype BigInt) 

    SELECT 
     IDENTITY(int) AS id, 
     CMM.movedate, 
     CDCP.paramdesc, 
     CMM.movementtypecd, 
     CMM.amountmoved, 
     CMM.planbalance, 
     cmm.sourceaccounttypeid, 
     cmm.destinationaccounttypeid 
    into #ivmy_cash_temp1 
    from 
     cash_moneymove CMM 
    inner join 
     CDC_PARAMETERS CDCP on CMM.movedescriptioncd=CDCP.paramcd 
    where 
     CMM.movedescriptioncd = @typedesc 
     and PARAMNAME = 'Cash AccountType Desc' 

    select * from #ivmy_cash_temp1 
END 
+0

您在交易中多次調用它? – TomTom

+2

您是否需要在使用後刪除臨時表格?即在存儲過程結束時? – booyaa

+2

您不需要在過程結束時刪除臨時表。 –

回答

5

一個SELECT INTO聲明爲您創建表。預先沒有必要使用CREATE TABLE聲明。

發生什麼事是您在CREATE聲明中創建#ivmy_cash_temp1,然後當您執行SELECT INTO時,DB嘗試爲您創建它。這會導致錯誤,因爲它正在嘗試創建已經創建的表。

要麼消除CREATE TABLE聲明,要麼改變填充它以使用INSERT INTO SELECT格式的查詢。

如果您需要將一個唯一的ID添加到您的新行,那麼最好使用SELECT INTO ...因爲IDENTITY()僅適用於此語法。

+0

嗨戴夫我必須做逐行操作的表...... plz建議我一些想法... – Ivan

+0

而不是做SELECT IDENTITY(int)AS id,CMM.movedate,... INTO#ivmy_cash_temp1等...用數據填充表格。使用INSERT INTO#ivmy_cash_temp1 SELECT IDENTITY(int)AS id,CMM.movedate,.... FROM等 –

+0

謝謝你dave我明白.​​......但是在我從臨時表中選擇了值之後顯示任何值......... – Ivan