Avatar billede beco Nybegynder
28. juli 2004 - 18:21 Der er 7 kommentarer

Sammenligne værdier inden update

Hej eksperter

Jeg er ved at lave en historik tabel, hvori jeg kun vil skrive de feltværdier som er blevet ændret.

Jeg kalder min stored procudere med alle værdierne, men hvordan får jeg dem sammenlignet med værdierne der allerede står i databasen ?
Avatar billede arne_v Ekspert
28. juli 2004 - 18:57 #1
Simplelt eksempel:

to tabeller currentdata og historydata
begge med to felter f1 og f2
både f1 og f2 er integer

CREATE PROCEDURE updwithhist
@f1 INTEGER,
@f2 INTEGER
As
DECLARE @oldf2 INTEGER
SET @oldf2 = (SELECT f2 FROM currentdata WHERE f1=@f1)
IF @oldf2 IS NULL
BEGIN
    INSERT INTO currentdata VALUES(@f1,@f2)
END
ELSE
BEGIN
  INSERT INTO historydata VALUES(@f1,@oldf2)
  UPDATE currentdata SET f2 = @f2 WHERE f1=@f1
END
GO
Avatar billede beco Nybegynder
29. juli 2004 - 12:49 #2
Betyder det at jeg skal hente alle værdierne enkeltvis ? Kan man ikke hente alle værdierne fra tabellen på en gang, eller skal man lave en

DECLARE @oldf2 INTEGER
SET @oldf2 = (SELECT f2 FROM currentdata WHERE f1=@f1)

for hvert felt ?
Avatar billede arne_v Ekspert
29. juli 2004 - 13:49 #3
Hvis du laver en cursor kan du hente mange felter i en enkelt query.
Avatar billede gudjon Nybegynder
29. juli 2004 - 14:16 #4
Hvis der laves en trigger på currentdata er der adgang til både de nye og de gamle værdier på een gang i triggeren. Brug IF UPDATE(felt) eller sammenlign felterne mellem tabellen og INSERT rækken.
Check at der kun arbejdes med een række ad gangen.
Avatar billede beco Nybegynder
30. juli 2004 - 09:04 #5
Jeg er ikke så god til sådan noget avanceret SQL.

Hvis jeg nu har min Kunde som jeg godt vil opdatere, men kun de felter som er ændret .

CREATE PROCEDURE  spOpdaterKunde
(
    @fornavn varchar(20) = null,
    @afternavn varchar(20) = null,
    @adresse(20) = null
}

AS

GO

Hvad skriver jeg så mellem AS og GO ?
Avatar billede gudjon Nybegynder
02. august 2004 - 08:46 #6
Du bliver først nødt til at identificere kunden, evt. ved hjælp af kundenr

CREATE PROCEDURE spOpdaterKunde
(@pKundenr int = NULL
,@pfornavn varchar(20) = NULL
,@pafternavn varchar(20) = NULL
,@padresse varchar(20) = NULL
)AS
DECLARE
@fornavn varchar(20) = NULL
,@afternavn varchar(20) = NULL
,@adresse varchar(20) = NULL

IF @pKundenr IS NULL
BEGIN
    RAISERROR ('spOpdaterKunde, Fejl 60001; Mangler Kundenr')
END

SELECT
@fornavn = fornavn
,@afternavn = afternavn
,@adresse = adresse
FROM Kunde
WHERE Kundenr = @pKundenr

IF @fornavn != @pfornavn
BEGIN
    UPDATE Kunde
    SET fornavn = @pfornavn
    WHERE Kundenr = @pKundenr
END

IF @afternavn != @pafternavn
BEGIN
    UPDATE Kunde
    SET afternavn = @pafternavn
    WHERE Kundenr = @pKundenr
END

IF @adresse != @padresse
BEGIN
    UPDATE Kunde
    SET adresse = @paadresse
    WHERE Kundenr = @pKundenr
END
go
Avatar billede beco Nybegynder
18. august 2004 - 22:48 #7
Hej Gudjon

Gider du ikke lige skrive et svar som jeg kan acceptere ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester