RulleRimfrost Skrevet 4. desember 2009 Del Skrevet 4. desember 2009 (endret) Driver å forsker litt stored procedures her. Hvordan kan jeg få en sproc til å oppdatere child-tabellen (address) med referansen til parent-tabell (id_client)? Om det er en insert, så vil jeg jo ikke kjenne denne før den er opprettet. Om det er en update, må jeg ha en egen "BEGIN"-løkke basert på en ny select-statement? Det høres litt ineffektivt ut... Jeg har f eks følgende tabeller : create table client ( id_client int not null auto_increment primary key, orgnumber nchar(11) unique, clientname nvarchar(50) ) create table address ( id_address int not null auto_increment primary key, id_client int foreign key references client(id_client), address nvarchar(50), zip nvarchar(6) ) og denne sproc'en : ALTER PROCEDURE [dbo].[sp_updateClient] @orgnumber nchar(11), @clientname nvarchar(50), @address nvarchar(50), @zip nvarchar(6) AS BEGIN SET NOCOUNT ON; /* Finnes raden fra før? */ IF EXISTS( SELECT id_client FROM client WHERE orgnumber = @orgnumber) /* I så fall oppdaterer vi den */ BEGIN UPDATE client SET orgnumber = @orgnumber, clientname = @clientname WHERE orgnumber = @orgnumber RETURN 0 END /* Hvis ikke, lager vi en ny */ ELSE BEGIN INSERT INTO client(orgnumber, clientname) VALUES(@orgnumber, @clientname) RETURN 1 END END Endret 4. desember 2009 av RulleRimfrost Lenke til kommentar
kaffenils Skrevet 4. desember 2009 Del Skrevet 4. desember 2009 Antar det er SQL Server 2005? I så fall bruker du scope_identity() funksjonen for å lese siste identity verdi for gjeldene scope. Les mer her: http://msdn.microsoft.com/en-us/library/ms190315.aspx Lenke til kommentar
RulleRimfrost Skrevet 4. desember 2009 Forfatter Del Skrevet 4. desember 2009 Sql server express ja, men i kveld skal jeg heller spille DA:origins Forstår det slik at man da vanligvis tar child-tabellen i en egen BEGIN-bolk, slik som f eks : BEGIN INSERT INTO client(orgnumber, clientname) VALUES(@orgnumber, @clientname) END BEGIN INSERT INTO address(id_client, address, zip) VALUES(SCOPE_IDENTITY, @address, @zip) END Lenke til kommentar
kaffenils Skrevet 5. desember 2009 Del Skrevet 5. desember 2009 Det er ikke vits i å bruke BEGIN END. Hvor har du det fra? Det som er viktig er at du kjører alle statements i en transaksjon slik at du kan rulle tilbake alle endringer hvis det skulle feile en plass. Du må skrive SCOPE_IDENTITY() med parenteser. Jeg har aldri brukt SCOPE_IDENTITY() i VALUES listen, men det burde i teorien fungere. Hvis ikke så deklarerer du en variabel som du tilegner verdien til SCOPE_IDENTITY(). Feks: declare @ClientId int insert... set @ClientId=scope_identity() insert... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå