21. februar 2006 - 11:57Der er
9 kommentarer og 1 løsning
TSQL Spørgsmål, Stored Procedure
Hej Jeg skal duplikere en ordreline, og den nye line skal have rettet et linienr +1 og i den orginale skal et felt have ændret fortegn
Jeg bruger: Select * Into OrderLinie Where LineNr=@LineNr AND Ordrenummer=@ordrenummer
Denne linie skulle gerne give mig en ny linie magen til den gamle. Nu skal jeg så rette i en af linierne af gangen. Jeg kan jo være ligeglad med hvilken, ikk?
UPDATE OrderLinie SET LinieNr=@Linie, LagerNr=@OrderGr4 WHERE LineNr=@LineNr AND Ordrenummer=@ordrenummer
Men denne linie ændre vel i begge records. Hvordan kan jeg gøre så man kun får fat i den nye kopi. Kan man sige noget om: WHERE inserted?
Der er en alvorlig mangel ved din ordrelinietabel: Den har ingen Primary Key, og det skal den have. Ellers er det nemlig umuligt at vide præcis hvilken record der er hvilken
Så select ind i #OrderLinie i stedet. Altså lave en temporær tabel i din SP og ret det ene felt med en update og indsæt linien derefter i den rigtige tabel. Dertil skal du nok følge ldanielsens PK bemærkning også. Det vil også hjælpe dig med udtræk fra tabellen.
Hvis den har en primary key, og du laver en komplet kopi af en post, så vil også din primary key være den samme som i den originale post, og det kan man ikke, for primary keys er unikke.
Derfor skal du nævne alle de felter du vil have selectet, det vil sige alle undtagen primary key. Den sætning du brugte vil ikke virke.
Gør sådan:
INSERT INTO Tabellen (LineNr, Ordrenummer, col1, col2, col3) SELECT LineNr, Ordrenummer, col1, col2, col3 FROM Tabellen WHERE LineNr = @LineNr AND Ordrenummer = @ordrenummer
Hvis du gør det i en stored procedure eller på anden måde under en transaction kan du derefter hente Primary Key for den nye række ud med @@IDENTITY (jeg antager at din key hedder OrderLinieID:
INSERT INTO OrderLinie (LineNr, Ordrenummer, col1, col2, col3) SELECT LineNr, Ordrenummer, col1, col2, col3 FROM OrderLinie WHERE LineNr = @LineNr AND Ordrenummer = @ordrenummer
UPDATE OrderLinie SET LinieNr = @Linie, LagerNr = @OrderGr4 WHERE OrderLinieID = @@IDENTITY
Bemærk dog at det kun er din application der sikrer at INSERT'en kun giver én ny række, medmindre du laver en UNIQUE CONSTRAINT med begge felterne LineNr og Ordrenummer, så er du helt sikker.
@@IDENTITY returnerer den sidste værdi der er indsat i databasen af typen identity. Så du kan kun bruge den hvis den værdi du er ude efter er identity.
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.