Comment créer une variable temporaire égale à l'identifiant de la dernière ligne insérée

SQL n00b ici. Une idée de ce que je fais mal? J'espère que vous pourrez comprendre ce que j'ai l'intention de faire.

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

Je reçois l'erreur pas très détaillée

Syntaxe incorrecte près de 'INSERT'

Dans SQL Server, la bonne façon de gérer cela est la clause OUTPUT . Je vous recommand d'apprendre cette méthode et de s'y tenir.

 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; 

Ceci est préférable à d'autres methods car il capture explicitement les informations souhaitées dans une table, qui peut ensuite être traitée. Le code est plus robuste car il n'y a aucun risque d'append une ligne de code "entre" et de casser le code existant. Il prend également en charge les insertions de plusieurs valeurs en même time.

Vous n'avez même pas besoin d'une variable pour cela. Rappelez-vous le principal KISS.

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

Vous pouvez utiliser IDENT_CURRENT

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

Puis réutilisez le @CatId dans l' INSERT

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

IDENT_CURRENT renvoie la dernière valeur d'identité générée pour une table spécifique dans une session et une scope.

Si vous voulez que votre session soit limitée à votre session, vous pouvez utiliser SCOPE_IDENTITY