Avatar billede senil Nybegynder
21. februar 2006 - 11:57 Der 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?
Avatar billede teepee Nybegynder
21. februar 2006 - 12:09 #1
I stedet for select * så skriv feltnavnen og i stedet for at selecte LineNr så selecter du bare Linenr+1
Avatar billede ldanielsen Nybegynder
21. februar 2006 - 12:33 #2
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
Avatar billede senil Nybegynder
21. februar 2006 - 12:40 #3
Der er et problem med OrderLine. Den har en key... men den har nok 100 felter, od det er dem jeg gerne vil ungå at skrive.
Avatar billede teepee Nybegynder
21. februar 2006 - 12:56 #4
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.
Avatar billede ldanielsen Nybegynder
21. februar 2006 - 13:00 #5
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
Avatar billede ldanielsen Nybegynder
21. februar 2006 - 13:03 #6
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
Avatar billede ldanielsen Nybegynder
21. februar 2006 - 13:06 #7
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.
Avatar billede senil Nybegynder
21. februar 2006 - 13:15 #8
hej Idanielsen

Tak for hjælpen.
@@IDENTITY er lige den jeg stod og manglede
Giv et svar, så gir jegf point
Avatar billede ldanielsen Nybegynder
21. februar 2006 - 13:20 #9
Svar :o)

@@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.

Hvis du lave noget sådan:

<Åbn connection>
INSERT ...
<Luk connection>

<Åbn connection>
SELECT @@IDENTITY
<Luk connection>

så kan du ikke regne med at værdien er den rigtige, for der kan være andre der har insertet i mellemtiden. Det SKAL være indenfor samme transaction.
Avatar billede ldanielsen Nybegynder
21. februar 2006 - 13:20 #10
Åh, glemte at trykke på svar ...
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