webForumDet fria alternativet

Dubbla @@IDENTITY i procedur

15 svar · 504 visningar · startad av ironhead

ironheadMedlem sedan mars 20011 346 inlägg
#1

Hej alla glada!

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

...en får inget att fungera :(

Hur är det man ska skriva?

GeinMedlem sedan sep. 20005 700 inlägg
#2

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
ironheadMedlem sedan mars 20011 346 inlägg
#3

Får fortfarande "null" vid andra @@IDENTITY :(

Har det betydelse att den andra "omgången" dvs. tbl13 och tbl4 ligger i en annan databas?

GeinMedlem sedan sep. 20005 700 inlägg
#4

ehm, jaha.
Ändra till

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?

GeinMedlem sedan sep. 20005 700 inlägg
#5

ironhead skrev:

Får fortfarande "null" vid andra @@IDENTITY :(

Har det betydelse att den andra "omgången" dvs. tbl13 och tbl4 ligger i en annan databas?

Ligger tbl3 och tbl4 i en annan databas? Isåfall lär ju inte din procedur fungera över huvud taget.

ironheadMedlem sedan mars 20011 346 inlägg
#6

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.

ironheadMedlem sedan mars 20011 346 inlägg
#7

Jag får fel på

OUTPUT INSERTED.*

Incorrect syntax near OUTPUT

GeinMedlem sedan sep. 20005 700 inlägg
#8

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?

ironheadMedlem sedan mars 20011 346 inlägg
#9

Gein skrev:

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?

Japp!

ironheadMedlem sedan mars 20011 346 inlägg
#10

Försöker skriva såhär:

BEGIN
INSERT INTO tbl3 (tbl3) 
output Inserted.tbl3Id
VALUES(@var3)
INSERT INTO tbl4 (tbl3ID, tbl4)
SELECT @@IDENTITY, @var4
END

...men får det inte att funka

Ska man inte bara ange det cell-värde man vill ha ut?

GeinMedlem sedan sep. 20005 700 inlägg
#11

My mistake! OUTPUT kom först i SQL Server 2005.

ironheadMedlem sedan mars 20011 346 inlägg
#12

näe, mitt misstag....den 3dje databasen ligger på en MSSQL 2005 :-/
...men fattar fortfarande inte syntaxen :(

ironheadMedlem sedan mars 20011 346 inlägg
#13

aha! Jag tänker mig inte för....output kommer inte att fungera iom att proceduren ligger på en MSSQL 2000 :-/

Skulle det hjälpa då om jag delar upp den sista inserten i en procedur i MSSQL2005 och anropar den från procedur 1?

GeinMedlem sedan sep. 20005 700 inlägg
#14

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.

ironheadMedlem sedan mars 20011 346 inlägg
#15

Har lagt över tbl3 & tbl4 på en procedur på MSSQL2005 servern och anropar den från MSSQL200, men får detta fel:

Server 'mssql2005' is not configured for RPC

Jag har kört:

EXEC sp_serveroption 'mssql2005', 'RPC', 'ON'

men får samma felmeddelande.
Är det på 2000 servern eller 2005:an man ska köra denna kod?

ironheadMedlem sedan mars 20011 346 inlägg
#16

Tror jag fick iordning på det nu :D

Jag körde:

exec sp_serveroption MSSQL2005, 'rpc', true
exec sp_serveroption MSSQL2005, 'rpc out', true

på MSSQL2000, och nu får jag plötsligt alla id:n jag ville ha :D

Tack så hemskt mycket för ditt tålamod och din hjälpsamhet, Gein :)

135 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)