Jag har ett problem med en procedur. Har 4 INSERT som jag vill plocka ut 2 olika ID från. DBMS = MSSQL 2000. Fälten i de 2 tabellerna innehåller både räknare och är satt till "Primary key".
CREATE PROCEDURE dbo.Test1
(
@var1 varchar(50),
@var2 varchar(50),
@var3 varchar(50),
@var4 varchar(50)
)
AS
SET NOCOUNT ON
BEGIN
INSERT INTO tbl1 (var1) VALUES(@var1)
INSERT INTO tbl2 (tbl1ID, var2)
SELECT @@IDENTITY, @var2
END
BEGIN
INSERT INTO tbl3 (var3) VALUES(@var3)
INSERT INTO tbl4 (tbl3ID, var4)
SELECT @@IDENTITY, @var4
END
GO
Från den första "INSERT" in i "tbl2" kan jag få tag på det nya ID:t men i den andra (tbl4) blir det bara "null".
Jag tycks ha testat det mesta som:
SELECT @@IDENTITY
DECLARE @newid int
SELECT @newid = SCOPE_IDENTITY()
SET @newid = @@IDENTITY
SELECT SCOPE_IDENTITY()
SELECT IDENT_CURRENT('tbl3')
Det ser ut som att du avslutar proceduren lite för tidigt. Skriv ihop dina INSERT i ett och samma block.
CREATE PROCEDURE dbo.Test1
(
@var1 varchar(50),
@var2 varchar(50),
@var3 varchar(50),
@var4 varchar(50)
)
AS
SET NOCOUNT ON
BEGIN
INSERT INTO tbl1 (var1) VALUES(@var1)
INSERT INTO tbl2 (tbl1ID, var2)
SELECT @@IDENTITY, @var2
INSERT INTO tbl3 (var3) VALUES(@var3)
INSERT INTO tbl4 (tbl3ID, var4)
SELECT @@IDENTITY, @var4
END
GO
INSERT INTO tbl3 (var3) VALUES(@var3)
OUTPUT INSERTED.*
INSERT INTO tbl4 (tbl3ID, var4)
SELECT @@IDENTITY, @var4
och så testkör du proceduren och ser vad den spottar ut sig vid inserten till tbl3.
Har du provat köra PRINT @@IDENTITY efter andra insert i felsökningssyfte?
Trodde inte att det hade nån betydelse att det var olika databaser.
Ska försöka förklara.
Proceduren ligger under en databas som vi kan kalla db1.
I denna procedur gör jag en del "INSERT" i db1.
Sedan gör jag en INSERT i "db2" som är en databas som ligger på samma server med dock en annan databas.
så långt fungerar det bra. Jag får ut min @@IDENTITY.
Problemet uppkommer när jag i samma procedur kopplar upp mig mot en databas på en annan server. "db3" (Alias - länkad server)...det är här jag inte får ut nån @@IDENTITY. All annan data funkar bra.
Okej, kolla syntaxen på INSERT så ser du hur du använder OUTPUT. Den kan visa dig vilka rader som stoppades in i INSERT-uttrycket.
Men fungerar din INSERT i tbl3 bra? Dvs ser du att en ny rad hamnar i tabellen, bara det att du inte får ut någon identity?
Det är möjligt att det skulle fungera. Jag tänkte främst på OUTPUT i felsökningssyfte men du skulle faktiskt även kunna använda den istället för @@IDENTITY.
Typ såhär
DECLARE @tempTabell (
Id int PRIMARY KEY,
...
...
)
INSERT INTO tabell
OUTPUT INSERTED.* INTO @tempTabell
SELECT (....)
Sedan kör du typ
SELECT Id FROM @tempTabell
för att få ut motsvarande @@IDENTITY.
Däremot känns som att du kanske borde hitta problemet med @@IDENTITY istället, det ska ju fungera. Testa anropa en procedur på databasen som ligger på MS SQL 2005 och kolla om @@IDENTITY fungerar i den proceduren.