[英]SQL Server 2008 R2 - why does my temp table think it has an identity column?
我正在嘗試創建一個存儲過程,該存儲過程將能夠限制使用部門ID返回的記錄數。 我試圖通過加入臨時表來限制記錄。
當我運行下面的代碼時,出現錯誤:
僅當使用列列表且IDENTITY_INSERT為ON時,才能為表'#department'中的identity列指定一個顯式值。
這是代碼:
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專家,所以也許有更好的方法可以做到這一點?
臨時表具有一個標識列,因為SELECT .. INTO
復制了具有標識列的原始表的表結構。
我建議顯式創建您的臨時表,並列出要從部門中選擇的列。 在生產代碼中使用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
獲取實際需要的列來避免冗余
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.