ironheadMedlem sedan mars 20011 346 inlägg 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 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 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 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
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 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 Jag får fel på
OUTPUT INSERTED.*
Incorrect syntax near OUTPUT
GeinMedlem sedan sep. 20005 700 inlägg 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 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 My mistake! OUTPUT kom först i SQL Server 2005.
ironheadMedlem sedan mars 20011 346 inlägg näe, mitt misstag....den 3dje databasen ligger på en MSSQL 2005 :-/
...men fattar fortfarande inte syntaxen :(
ironheadMedlem sedan mars 20011 346 inlägg 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 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 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 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 :)