|
| SQL: Kopiere en post i samme tabel Fra : Klaus Ambrass |
Dato : 17-12-02 09:46 |
|
Hej,
jeg står og skal oprette en kopi af en post i en tabel. Posten indeholder
BARE mange felter, og for ikke at skulle skrive dem allesammen (og måske
glemme eller stave nogle af dem forkert) så tænkte jeg på om SQL havde en
smart feature der vupti kopierede alle felter uden at bekymre sig om hvor
mange og hvilke navne de havde. Noget i stil med:
INSERT INTO myTable (SELECT * FROM myTable WHERE id=2);
Hilfe, please.
--
Klaus Ambrass
IT - Storstrøms Amt
kam@it.stam.dk
| |
tsl (17-12-2002)
| Kommentar Fra : tsl |
Dato : 17-12-02 22:00 |
|
> jeg står og skal oprette en kopi af en post i en tabel. Posten indeholder
> BARE mange felter, og for ikke at skulle skrive dem allesammen (og måske
> glemme eller stave nogle af dem forkert) så tænkte jeg på om SQL havde en
> smart feature der vupti kopierede alle felter uden at bekymre sig om hvor
> mange og hvilke navne de havde. Noget i stil med:
> INSERT INTO myTable (SELECT * FROM myTable WHERE id=2);
Prøv med:
SELECT * INTO newTable FROM myTable WHERE id=2;
| |
Jens Gyldenkærne Cla~ (17-12-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 17-12-02 10:21 |
|
tsl skrev:
>> jeg står og skal oprette en kopi af en post i en tabel.
> Prøv med:
>
> SELECT * INTO newTable FROM myTable WHERE id=2;
Det vil kopiere en post til en ny tabel.
Hvis man skal kopiere til samme tabel kan man i princippet skrive:
INSERT INTO myTable
SELECT * FROM myTable
WHERE id = 2
Men - det er sjældent det vil virke fordi en tabel som regel har en
primærnøgle. Primærnøglens funktion er at være unik i tabellen, så
derfor kan man ikke sætte en fuldstændig kopi af en post ind.
En hurtig omvej kan være at benytte det forslag tsl skrev, derefter
fjerner man primærnøglefeltet fra newTable og laver en
INSERT INTO myTable
SELECT * FROM newTable
Det forudsætter at primærnøglefeltet er et autonummereringsfelt.
Ellers kan man blot opdatere feltet i newTable inden man kopierer
tilbage.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)
| |
Klaus Ambrass (17-12-2002)
| Kommentar Fra : Klaus Ambrass |
Dato : 17-12-02 10:56 |
|
Jens Gyldenkærne Clausen <jens@gyros.invalid> wrote in
news:Xns92E7694F8D607jcdmfdk@gyrosmod.dtext.news.tele.dk:
> tsl skrev:
>
>>> jeg står og skal oprette en kopi af en post i en tabel.
>
>> Prøv med:
>>
>> SELECT * INTO newTable FROM myTable WHERE id=2;
>
> Det vil kopiere en post til en ny tabel.
> Hvis man skal kopiere til samme tabel kan man i princippet skrive:
>
> INSERT INTO myTable
> SELECT * FROM myTable
> WHERE id = 2
>
> Men - det er sjældent det vil virke fordi en tabel som regel har en
> primærnøgle. Primærnøglens funktion er at være unik i tabellen, så
> derfor kan man ikke sætte en fuldstændig kopi af en post ind.
> En hurtig omvej kan være at benytte det forslag tsl skrev, derefter
> fjerner man primærnøglefeltet fra newTable og laver en
>
> INSERT INTO myTable
> SELECT * FROM newTable
>
> Det forudsætter at primærnøglefeltet er et autonummereringsfelt.
> Ellers kan man blot opdatere feltet i newTable inden man kopierer
> tilbage.
Hej I to,
jeg har leget lidt i mellemtiden på min sql server og fundet ud af, at der
ikke er nogen "nem" måde til at løs dette problem, fordi - som Jens netop
beskriver - at autonummerfeltet blokerer.
I sql-serveren er der to tabeller, sysobjects og syscolumns, som indeholder
hhv. min tabel og dets kolonner. Jeg har lavet et udtræk som giver mig alle
kolonnenavne exkl. feltet "ID", som er min primærnøgle og autonummerfelt.
Jeg skal godt nok bruge det hele fra en ASP side, men jeg vil gerne klare
det hele via en stored procedure. Denne SQL-sætning indeholder alle de
relevante felter fra tabellen:
SELECT syscolumns.name AS FName
FROM sysobjects
INNER JOIN syscolumns ON sysobjects.id = syscolumns.id
WHERE (syscolumns.name <> N'id')
AND (sysobjects.name = N'tbl_oVisitation')
ORDER BY syscolumns.name
(Min tabel hedder tbl_oVisitation og min primærnøgle hedder ID, og jeg er
interesseret i at kopiere post #32).
Hvordan kan jeg putte disse felter ind i en INSERT INTO sætning, noget i
stil med:
INSERT INTO tbl_oVisitation (SELECT-ovenfor)
VALUES (SELECT * FROM tbl_oVisitation WHERE id=32)
Jeg kan ikke rigtigt få det til at spille, selv om jeg benytter strukturern
for en sub-SELECT. Hvad går der galt?
--
Klaus Ambrass
IT - Storstrøms Amt
kam@it.stam.dk
| |
tsl (17-12-2002)
| Kommentar Fra : tsl |
Dato : 17-12-02 23:32 |
|
> Hvordan kan jeg putte disse felter ind i en INSERT INTO sætning, noget i
> stil med:
> INSERT INTO tbl_oVisitation (SELECT-ovenfor)
> VALUES (SELECT * FROM tbl_oVisitation WHERE id=32)
> Jeg kan ikke rigtigt få det til at spille, selv om jeg benytter
strukturern
> for en sub-SELECT. Hvad går der galt?
Jeg har været ved at søge lidt omkring problemet og har fundet følgende
quote:
"it is forbidden in ANSI SQL to SELECT from the same table into which you
are inserting"
Jeg har stadig ingen ideer, udover at flytte data til en temp-tabel (SELECT
INTO) og så flytte dem videre derfra. Det er i hvert fald
sådan jeg altid har gjort det.
| |
Klaus Ambrass (17-12-2002)
| Kommentar Fra : Klaus Ambrass |
Dato : 17-12-02 11:56 |
|
"tsl" <dingamlemamma@hotmail.com> wrote in
news:3dfefd60$0$170$edfadb0f@dread16.news.tele.dk:
>> Hvordan kan jeg putte disse felter ind i en INSERT INTO sætning, noget
>> i stil med:
>> INSERT INTO tbl_oVisitation (SELECT-ovenfor)
>> VALUES (SELECT * FROM tbl_oVisitation WHERE id=32)
>> Jeg kan ikke rigtigt få det til at spille, selv om jeg benytter
>> strukturern for en sub-SELECT. Hvad går der galt?
>
> Jeg har været ved at søge lidt omkring problemet og har fundet følgende
> quote:
>
> "it is forbidden in ANSI SQL to SELECT from the same table into which
> you are inserting"
>
> Jeg har stadig ingen ideer, udover at flytte data til en temp-tabel
> (SELECT INTO) og så flytte dem videre derfra. Det er i hvert fald
> sådan jeg altid har gjort det.
>
>
>
Hæ, typisk ANSI...
Jeg tror jeg benytter plan B og laver min egen SQL-streng ved at concatte
alle feltnavne og fyrer den så af mod min tabel. Det er lidt bøvlet, men
hvis jeg laver det som en sub eller class så kan jeg genbruge den i andre
scripts.
Tak for hjælpen.
--
Klaus Ambrass
IT - Storstrøms Amt
kam@it.stam.dk
| |
Jens Gyldenkærne Cla~ (17-12-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 17-12-02 12:39 |
|
tsl skrev:
> Jeg har været ved at søge lidt omkring problemet og har fundet
> følgende quote:
>
> "it is forbidden in ANSI SQL to SELECT from the same table
> into which you are inserting"
O.k. - det vidste jeg ikke.
> Jeg har stadig ingen ideer, udover at flytte data til en
> temp-tabel (SELECT INTO) og så flytte dem videre derfra. Det
> er i hvert fald sådan jeg altid har gjort det.
MSSQL tilbyder også en tabelvariabel (altså en tabel i
hukommelsen). Der er næppe den store forskel i syntaks, men det bør
køre hurtigere uden en fysisk tabel.
NB: Dit ur er foran.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)
| |
Nis Jorgensen (17-12-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 17-12-02 10:30 |
|
On 17 Dec 2002 08:46:28 GMT, Klaus Ambrass <kam@it.stam.dk> wrote:
>jeg står og skal oprette en kopi af en post i en tabel. Posten indeholder
>BARE mange felter, og for ikke at skulle skrive dem allesammen (og måske
>glemme eller stave nogle af dem forkert) så tænkte jeg på om SQL havde en
>smart feature der vupti kopierede alle felter uden at bekymre sig om hvor
>mange og hvilke navne de havde. Noget i stil med:
>
>INSERT INTO myTable (SELECT * FROM myTable WHERE id=2);
Ovenstående bør virke - bortset fra at "id" jo nok skal være unik .
Jeg kan ikke umiddelbart se nogen løsning på det problem - idet der
ikke er en "alle felter undtagen id" syntax.
--
Nis Jørgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
|
|