web-dev-qa-db-ja.com

一時テーブルを作成して値を挿入するSQL Serverストアドプロシージャ

別のテーブルから値を選択して、一時テーブルに挿入しようとしています。

一時テーブルにIDフィールドが必要です。次のコードを実行しようとすると、エラーがスローされます。

*メッセージ2714、レベル16、状態1、プロシージャSelectCashDetails、行27
データベースにはすでに「#ivmy_cash_temp1」という名前のオブジェクトがあります。*

同じエラーがスローされた後でも、一時テーブルを別の名前に変更しようとしています。

これは私のコードです:

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
7
Ivan

_SELECT INTO_ステートメントは、テーブルを作成します。事前に_CREATE TABLE_ステートメントを使用する必要はありません。

起こっているのは、CREATEステートメントで_#ivmy_cash_temp1_を作成し、_SELECT INTO_を実行すると、DBがそれを作成しようとすることです。これにより、既に作成したテーブルを作成しようとしているため、エラーが発生します。

_CREATE TABLE_ステートメントを削除するか、それを埋めるクエリを変更して_INSERT INTO SELECT_形式を使用します。

新しい行に一意のIDを追加する必要がある場合は、IDENTITY()がこの構文でのみ機能するため、_SELECT INTO_...を使用するのが最善です。

7
Dave K