2017-03-27 4 views
1

Ich habe diese drei TabellenMake Verfahren mit SCOPE_IDENTITY()

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), 
) 

Ich schaffe diese Prozedur Daten in FirstTable und Relation einzufügen:

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) 

I Werte von den Dropdownlists zum Beispiel Daten übergeben, und Übergeben Sie nichts für @FirstTable, weil ich erwarte, dass es SCOPE_IDENTITY() erhalten, aber ich habe Fehler wie folgt: "Muss die skalare Variable" @FirstTableId "deklarieren? Wie kann ich das lösen und es funktioniert?

+0

Ihr Beispielcode neu das Problem nicht. – SqlZim

Antwort

1

Sie müssen die Variable im Rumpf deklarieren und nicht die Stored Procedure-Definition. Wenn Sie es in der Definition deklarieren, bedeutet dies, dass Sie den Wert übergeben, wenn Sie die Stored Procedure aufrufen.

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) 
+1

Der Parameter wird in der Prozedur deklariert. Ihr Code verursacht den folgenden Fehler: "Der Variablenname" @FirstTableId "wurde bereits deklariert. Variablennamen müssen innerhalb eines Abfrage-Batches oder einer gespeicherten Prozedur eindeutig sein." – SqlZim

+0

Rechts. Entferne das und füge es meinem Weg hinzu. In dieser Definition müssen Sie übergeben werden, wenn Sie die gespeicherte Prozedur aufrufen. – Forklift

+0

Siehe meine Bearbeitung. Das sollte mehr Sinn machen. @SqlZim – Forklift

1

Haben Sie einen Tippfehler in Ihrem tatsächlichen Code? Weil Sie in Ihrer Frage sagen, dass der Prozessparameter @FirstTable ist und später sagen, der Fehler ist etwa @FirstTableId, und in der Beispielprozedur lautet der Name des Parameters @FirstTableId.


Wenn Sie nicht aus dem Parameter Eingang oder Ausgang etwas brauchen, zu erklären und die Variable in dem Verfahren verwendet werden.

Wenn Sie versuchen, einen Ausgabeparameter zu verwenden, dann würden Sie den Parameter als Ausgangs deklarieren:

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 

und es verwenden, etwa so:

declare @id int; 
exec insertinto @id output; 

select @id as IdOutput; 

kehrt

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

und die Zeile aus der Beziehungstabelle:

select * from relation; 

kehrt

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

rextester Demo: http://rextester.com/VPS78362