Avatar billede hijacked Nybegynder
15. februar 2010 - 15:15 Der er 11 kommentarer og
1 løsning

Dynamisk feltnavn i INSERT values clause

Hej Eksperter!

Jeg har et lille problem vedr. dynamisk SQL Insert i min values clause. Jeg er sprit ny på MS SQL SERVER 2005 så bær over med mig hvis jeg er et fjols :-)

Jeg har en tabel med 2 felter. Jeg skal løbe tabellen igennem og for hvert felt i hver record skal jeg indsætte en række i en anden tabel.  Jeg har prøvet med følgende:


create table #my_tab (felt_1 smallmoney, felt_2 smallmoney)
insert into #my_tab (felt_1,felt_2) values (500.43,400.87)

DECLARE MY_CURSOR Cursor
FOR
select felt_1, felt_2 from #my_tab

declare
@felt_1 smallmoney,
@felt_2 smallmoney

open my_cursor

fetch next from my_cursor into
  @felt_1,
  @felt_2

while (@@fetch_status = 0)
begin
    declare @sql nvarchar(800),
            @counter int,
            @main_counter int

    set @main_counter = 1
    print @felt_1
-- Giver mig indholdet af @felt_1 (502.43)
    while @main_counter < 3
    begin
      declare @felt varchar(7)
      set @felt = '@felt_' + cast(@main_counter as varchar(2))
      set @sql = 'insert into #tmp_tab(felt_value) values ('+@felt+')'
      print @sql
-- Det er her mit problem ligger.
-- Den giver mig ved første gennemløb "insert into #tmp_tab(felt_value) values (@felt_1)"
-- Jeg vil gerne have "insert into #tmp_tab(felt_value) values (502.45)"
--Hvordan refererer jeg til indholdet af variablen i stedet for variablen selv????????
      set @main_counter = @main_counter+1
    end
    fetch next from my_cursor into
      @felt_1,
      @felt_2
end
close my_cursor
deallocate my_cursor

Nogen der kan hjælpe?? Jeg er helt på bar bund synes jeg. Har også prøvet at google det uden held (ihvertfald ikke noget jeg kunne forstå :-)

På forhånd mange tak for hjælpen!
Avatar billede showsource Seniormester
15. februar 2010 - 15:44 #1
Indsætte fra en tabel til en anden?

INSERT INTO nytabel (SELECT * FROM oldtabel)

forudsætter selvf. at begge tabeller har samme struktur.
Og ellers skal du angive feltnavne

INSERT INTO nytabel (felt_et, felt_to) VALUES (SELECT et, to FROM oldtabel)

Utestet !
Avatar billede showsource Seniormester
15. februar 2010 - 15:46 #2
uhh, det er jo MS SQL, men mon ikke det er standard ?
Avatar billede hijacked Nybegynder
15. februar 2010 - 16:29 #3
Jeg skal jo indsætte en RECORD i den ene tabel for hvert FELT i den anden...Spørgsmålet går på hvordan man dynamisk kan referere til indholdet af mit variable feltnavn.
Avatar billede janus_007 Nybegynder
15. februar 2010 - 19:19 #4
Det lyder jo helt vanvittigt hehe...

Jeg forstår ikke rigtigt hvad du skriver, skal det forståes som at du ønsker

500.43,400.87
510.12, 669.45

Som:
500.43
400.87
510.12
669.45

Altså som 1 kolonne?
Avatar billede hijacked Nybegynder
16. februar 2010 - 07:54 #5
lige nøjagtigt! :-)
Avatar billede hijacked Nybegynder
16. februar 2010 - 11:32 #6
bump
Avatar billede janus_007 Nybegynder
16. februar 2010 - 21:20 #7
hmm
Sådan her:

select felt_1 from #my_tab
union
select felt_2 from #my_tab
Avatar billede janus_007 Nybegynder
16. februar 2010 - 21:36 #8
Sad  lige og fedtede lidt videre... hvis du vil lave den 100% dynamisk altså med n-kolonner så kan du gøre sådan her:

create table my_tab (felt_1 smallmoney, felt_2 smallmoney)
insert into my_tab (felt_1,felt_2) values (500.43,400.87)


  declare @sql varchar(5000)
  select @sql =  ISNULL(@sql, '') + 'select convert(varchar(255), ' + [name] + ') from my_tab union ' from sys.columns where object_id = object_id('my_tab')
  set @sql = left(@sql, LEN(@sql) - 5)
  exec(@sql)

Helt op til dig :)
Avatar billede hijacked Nybegynder
17. februar 2010 - 09:14 #9
Se nu er vi ved at være der! :-) Jeg har rent faktisk 24 felter i tabellen så UNION synes jeg ikke rigtig var en option, men det er vel egentlig ok når jeg kan bygge den op dynamisk som du viser ovenfor. Så kan jeg jo bare loope rundt om den og bygge en SQL op med de 24 UNIONs dynamisk. Mange tak for hjælpen, send et svar så du kan få pointene.
Avatar billede hijacked Nybegynder
17. februar 2010 - 09:21 #10
Hov jeg behøver jo ikke engang at loope! :-) lækkert!
Avatar billede janus_007 Nybegynder
17. februar 2010 - 14:07 #11
At loope i Sql er en dødssynd :)

Forsøg altid med setbased operationer først, sidste løsning er altid cursors :)
Avatar billede hijacked Nybegynder
17. februar 2010 - 14:11 #12
Tak for hjælpen Janus, jeg prøver at holde mig fra cursors :-)
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