Gå til innhold

UPDATE og INSERT på relaterte tabeller


Anbefalte innlegg

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 av RulleRimfrost
Lenke til kommentar
Videoannonse
Annonse

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...