Procédure avec SCOPE_IDENTITY ()

J'ai eu ces trois tables

CREATE TABLE ( FirstTableId Int primary key identity, Something nvarchar(20) ) CREATE TABLE SecondTable ( SecondTableId Int primary key identity, Something nvarchar(20) ) CREATE TABLE Relation ( RelationId int primary key identity, RelationSomething nvarchar(20), FirstTableId Int, SecondTableId Int, FOREIGN KEY (FirstTableId) REFERENCES FirstTable(FirstTableId), FOREIGN KEY (SecondTableId) REFERENCES SecondTable(SecondTableId), ) 

Je crée cette procédure pour insert des données dans FirstTable et Relation:

 CREATE PROC InsertInto (@FirstTableId int) AS INSERT INTO FirstTable VALUES ('example') SELECT @FirstTableId = SCOPE_IDENTITY() INSERT INTO Relation (RelationSomething, FirstTableId, SecondTableId) VALUES ('example', @FirstTableId, 2) 

Je passe les valeurs des lists déroulantes par exemple des données, et ne passe rien pour @FirstTable, parce que je m'attends à get SCOPE_IDENTITY (), mais j'ai une erreur comme ceci: "Doit déclarer la variable scalaire" @FirstTableId "? cela et faire son travail?

Vous devez déclarer la variable dans le corps et non la définition de la procédure stockée. Lorsque vous le déclarez dans la définition, cela signifie que vous passerez la valeur lorsque vous appelez la procédure stockée.

 CREATE PROC InsertInto () AS DECLARE @FirstTableId int; INSERT INTO FirstTable VALUES ('example') SET @FirstTableId = SCOPE_IDENTITY() INSERT INTO Relation (RelationSomething, FirstTableId, SecondTableId) VALUES ('example', @FirstTableId, 2) 

Avez-vous une faute de frappe dans votre code actuel? Parce que dans votre question, vous dites que le paramètre de procédure est @FirstTable et que plus tard l'erreur concerne @FirstTableId , et dans l'exemple le nom du paramètre est @FirstTableId .


Si vous n'avez pas besoin d'entrer ou de sortir quelque chose du paramètre, déclarez et utilisez la variable dans la procédure.

Si vous essayez d'utiliser un paramètre de sortie, vous déclarez le paramètre en sortie:

 create proc InsertInto (@FirstTableId int output) as begin; set nocount, xact_abort on; insert into FirstTable values ('example'); select @FirstTableId = scope_identity(); insert into Relation (FirstTableId, SecondTableId) values (@FirstTableId, 2); end; go 

et l'utilise comme ça:

 declare @id int; exec insertinto @id output; select @id as IdOutput; 

résultats

 +----------+ | IdOutput | +----------+ | 1 | +----------+ 

et la ligne de la table de relation:

 select * from relation; 

résultats

 +--------------+---------------+ | firsttableid | secondtableid | +--------------+---------------+ | 1 | 2 | +--------------+---------------+ 

rextester demo : http://rextester.com/VPS78362