2016-08-11 38 views
1

SQL n00b此處。任何想法我做錯了什麼?希望你能弄清楚我打算做什麼。如何創建一個臨時變量,該臨時變量等於上一次插入的行的編號

DECLARE @CatId INT; 
SET @CatId = (
    INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
    SELECT SCOPE_IDENTITY() 
); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

我得到的不是非常詳細的錯誤

附近有語法錯誤「插入」

+0

查詢中沒有「IMPORT」 – Lamak

+1

您不能設置這樣的變量。 –

+0

使用OUTPUT插入臨時表或表變量中,特別是如果您的設置操作將超過1條記錄。 – Matt

回答

1

你甚至都不需要爲這個變量。記住KISS校長。

INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (SCOPE_IDENTITY(),'TestName','TestDisplayName'); 
0

您可以使用IDENT_CURRENT

DECLARE @CatId INT 
SELECT @CatId = IDENT_CURRENT('Categories') 

然後再用@CatIdINSERT

INSERT INTO Fields (CategoryID, FieldName, DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

IDENT_CURRENT返回在任何會話和範圍的特定表生成的最後一個標識值。

如果你需要它來只作用域到您的會話,你可以使用SCOPE_IDENTITY

+0

這有潛在的併發問題。 –

+0

@SeanLange如果多個會話有問題,則OP可以使用'SCOPE_IDENTITY' –

+0

您的代碼應始終能夠處理多個會話。當您像這樣使用IDENT_CURRENT時,您正在創建競爭條件。爲什麼要使用有可能成爲問題的東西?只需使用SCOPE_IDENTITY即可,您不必限定它。 –

3

在SQL Server中,來處理這個正確的方式是OUTPUT條款。我建議你學習這種方法並堅持下去。

DECLARE @CatIds TABLE (catid int); 

INSERT INTO Categories (CategoryName) 
    OUTPUT inserted.catid INTO @CatIds; 
    VALUES ('TestCategory'); 

INSERT INTO Fields(CategoryID, FieldName, DisplayName) 
    SELECT CatId, 'TestName', 'TestDisplayName' 
    FROM @CatIds; 

這是優選的其他方法,因爲它明確捕獲所需的信息到表,然後可以被進一步處理。代碼更健壯,因爲沒有在「之間」添加一行代碼並破壞現有代碼的危險。它也支持同時插入多個值。