2013-01-15 85 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