2

部門 ID を使用して返されるレコードの数を制限できるストアド プロシージャを作成しようとしています。一時テーブルに参加してレコードを制限しようとしています。

以下のコードを実行すると、エラーが発生します。

テーブル '#department' の ID 列の明示的な値は、列リストが使用され、IDENTITY_INSERT が ON の場合にのみ指定できます。

コードは次のとおりです。

DECLARE @departmentID INT
SET @departmentID = 4

-- create temp department table --
select top 0 * into #department from PayrollDepartment

-- load temp department table
IF @departmentID < 1 OR @departmentID IS NULL
BEGIN
    INSERT INTO #department SELECT * FROM PayrollDepartment
END 
ELSE
BEGIN
    INSERT INTO #department SELECT * FROM PayrollDepartment WHERE PayrollDepartmentID =     @departmentID
END

私はから始めました:

IF @departmentID < 1 OR @departmentID IS NULL
BEGIN
    SELECT * INTO #department FROM ApplicationEmployeeInfo..PayrollDepartment
END 
ELSE
BEGIN
    SELECT * INTO #department FROM ApplicationEmployeeInfo..PayrollDepartment WHERE PayrollDepartmentID = @departmentID
END

しかし、私はエラーが発生します:

データベースには「#department」という名前のオブジェクトがすでに存在します

私はSQLの専門家ではないので、これを行うためのより良い方法があるでしょうか?

4

1 に答える 1

5

SELECT .. INTO ID 列を持つ元のテーブルのテーブル構造をレプリケートするため、一時テーブルには ID 列があります。

一時テーブルを明示的に作成し、部門から選択している列をリストすることをお勧めします。運用コードで SELECT * を使用することはほとんど良い考えではないため、select と insert を列に明示的にリストすることをお勧めします。

CREATE TABLE #Department
(   PayrollDepartmentID INT NOT NULL,
    <more columns>
);

IF @departmentID < 1 OR @departmentID IS NULL
    BEGIN
        INSERT #Department (PayrollDepartmentID, <more columns>)
        SELECT  PayrollDepartmentID, <more columns>
        FROM    PayrollDepartment;
    END
ELSE
    BEGIN
        INSERT #Department (PayrollDepartmentID, <more columns>)
        SELECT  PayrollDepartmentID, <more columns>
        FROM    PayrollDepartment
        WHERE   PayrollDepartmentID = @departmentID;
    END
    

それはより多くの作業のように見えるかもしれませんし、間違いなくより冗長ですが、長期的にははるかに優れたプラクティスであり、より堅牢です。また、実際に必要な列のみをフェッチすることで冗長性を回避できることも意味しますPayrollDepartment

于 2013-11-25T17:38:49.170 に答える