2013-11-25 20 views
2

我想創建一個存儲過程,將能夠限制使用部門ID返回的記錄數。我試圖通過加入臨時表來限制記錄。SQL Server 2008 R2 - 爲什麼我的臨時表認爲它有一個標識列?

當我運行下面的代碼,我得到的錯誤:

An explicit value for the identity column in table '#department' can only be specified when a column list is used and IDENTITY_INSERT is 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 

,但我得到的錯誤:

There is already an object named '#department' in the database

我不是SQL專家,所以也許有更好的方法來做到這一點?

+0

你需要在#department之後做任何事情嗎?或者你只是返回結果? – GarethD

+0

如果你做了一個'SELECT TOP 0 * INTO ...',你已經創建了表。你不能再次使用'INTO'。你需要一個'INSERT ... SELECT' – Kermit

+0

這是一個報告。我試圖使存儲過程「動態」,以便我可以獲取所有員工記錄,或者只是部門的記錄。我試圖避免使用硬編碼的SQL,並且我沒有兩個代碼塊(或存儲過程),其中唯一的區別是where子句。 – user3033282

回答

5

您的臨時表具有標識列,因爲SELECT .. INTO會複製您原始表的表結構,該表具有標識列。

我會建議明確創建臨時表,並列出您從部門選擇的列。這幾乎是never a good idea to use SELECT *在生產代碼,所以我建議明確列出你的選擇並插入列:

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

+0

感謝您的幫助!我用'SELECT TOP 0 INTO'代碼找到的頁面表示在事實之後需要添加主鍵。另一個建議,使用'SET IDENTITY_INSERT #department ON'會工作(但它沒有,當然不W/O列列表) – user3033282

+0

沒問題。我沒有任何反對「SELECT .. INTO」語法的東西,它對於臨時查詢非常方便,但正如我所說的,我將花費額外5分鐘的時間來明確編寫和創建表。 – GarethD

相關問題