+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: MSSQL Problema conversione tipi

  1. #1
    CC88 non è in linea Scolaretto
    Post
    91

    MSSQL Problema conversione tipi

    Ciao a tutti.

    Scusate molto probabilmente mi sto perdendo in un bicchiere d'acqua...

    Ricevo eseguento una stored procedure il seguente errore:

    Messaggio 8114, livello 16, stato 5, procedura sp_Giacenze, riga 190 [riga iniziale del batch 0]
    Error converting data type varchar to numeric.

    L'errore fa riferimento al fatto che sto eseguendo:

    codice:
    insert into ordiniattuali(cdarst,quantita)
    select cdarst ,@qta as qta 
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in ('12','40')  
    and nrfocc = '03' and timost in(01,07)
    @qta è un varchar perchè creo il nome del campo poco sopra:

    codice:
    IF @currentmonth < 10
    	SET @qta = 'QO0' + @meseqta + 'ST'
    ELSE
    	SET @qta = 'QO' + @meseqta + 'ST'
    Il campo quantita nella tabella ordiniattuali è un numerico...

    Scusate, sicuramente è una cavolata, ma io voglio usare @qta come nome campo da passare alla query, non come tipo dato. Non so se mi spiego.

    Se eseguo la stessa query impostando il nome del campo ovviamente tutto ok, ma io il nome del campo ho bisongno di comporlo come da codice sopra.

    Grazie.

  2. #2
    Luogo
    Lazio
    Post
    1,740
    Blogs
    21
    Quote Originariamente inviato da CC88 Visualizza il messaggio
    Ciao a tutti.
    ...
    codice:
    IF @currentmonth < 10
    	SET @qta = 'QO0' + @meseqta + 'ST'
    ELSE
    	SET @qta = 'QO' + @meseqta + 'ST'
    ....
    Se eseguo la stessa query impostando il nome del campo ovviamente tutto ok, ma io il nome del campo ho bisongno di comporlo come da codice sopra.
    @meseqta non si sa cosa sia , ma se ho ben capito non serve quello che stai facendo;

    ti basta usare il CASE nella select dove selezioni il campo in base al currentmont
    https://docs.microsoft.com/it-it/sql...l-server-ver15
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  3. #3
    CC88 non è in linea Scolaretto
    Post
    91
    Ciao.

    @meseqta è il valore del mese corrente.

    Se il mese corrente è <10 il nome del campo è QO09ST

    Se il mese corrente è >10 il nome del campo diventa QO10ST

    COmunque il problema non è quello, @qta viene correttamente creato ed è il nome del campo della query. Il problema è che quando vado ad usare il nome della variabile come nome campo della tabella nella query di select non mi viene permesso.

    La domana è quindi: come genero un nome campo tabella in una select dinamicamente?

  4. #4
    Luogo
    Lazio
    Post
    1,740
    Blogs
    21
    Quote Originariamente inviato da CC88 Visualizza il messaggio
    Ciao.
    ....
    La domana è quindi: come genero un nome campo tabella in una select dinamicamente?
    scusa se insisto, ma secondo me la domanda è :
    perchè non puoi usare CASE ?
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  5. #5
    CC88 non è in linea Scolaretto
    Post
    91
    Quote Originariamente inviato da sspintux Visualizza il messaggio
    scusa se insisto, ma secondo me la domanda è :
    perchè non puoi usare CASE ?
    Posso usarlo ma dovrei scrivere una cosa del genere ... da 01 a 99... (non guardare alla forma, è per farti capire):

    codice:
    CASE 1 
    insert into ordiniattuali(cdarst,quantita)
    select cdarst,QO01ST
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in (''12'',''40'')  
    and nrfocc = ''03'' and timost in(01,07)
    CASE 2
    insert into ordiniattuali(cdarst,quantita)
    select cdarst,QO02ST
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in (''12'',''40'')  
    and nrfocc = ''03'' and timost in(01,07)
    CASE ...
    CASE 11
    insert into ordiniattuali(cdarst,quantita)
    select cdarst,QO11ST
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in (''12'',''40'')  
    and nrfocc = ''03'' and timost in(01,07)
    Io vorrei compilare dinamicamente la select mettendo il valore QO che si incrementa...

    Oppure intendi una cosa tipo:

    codice:
    select cdmndi,(case nrpgdi when 0 then 'MANTELLO' when 1 then 'APPARECCHIO' end)
    Ultima modifica di CC88; 02-09-2020 12:52 

  6. #6
    Luogo
    Lazio
    Post
    1,740
    Blogs
    21
    Quote Originariamente inviato da CC88 Visualizza il messaggio
    Oppure intendi una cosa tipo:

    codice:
    select cdmndi,(case nrpgdi when 0 then 'MANTELLO' when 1 then 'APPARECCHIO' end)
    si, intendo questo

    nella when e nella then puoi usare anche nomi di campo di tabelle.

    Se ancora non ti va bene devi spiegare meglio il problema indicando anche
    la struttura essenziale delle tabelle coinvolte
    Ultima modifica di sspintux; 02-09-2020 15:09 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  7. #7
    CC88 non è in linea Scolaretto
    Post
    91
    Quote Originariamente inviato da sspintux Visualizza il messaggio
    si, intendo questo

    nella when e nella then puoi usare anche nomi di campo di tabelle.

    Se ancora non ti va bene devi spiegare meglio il problema indicando anche
    la struttura essenziale delle tabelle coinvolte
    scusa ma forse c'è qualcosa che non comprendo io...

    Se devo usare un CASE per tre valori è un conto... ma se voglio dinamicamente scegliere quel campo, su 400 campi, mica posso scrivere 400 CASE...

    Quindi la domanda, che mi pare semplice: è possibile rendere variabile il nome del campo B in una select?
    codice:
    SELECT A,<nome di colonna variabile> FROM TABELLA
    Supponi io abbia impostato 400 colonne, 001, 002, 003, 004, ... , 400 e volessi fare una select che estrae il valore impostato in una riga e volessi rendere random la colonna dalla quale pescare questo valore... Come faccio?

  8. #8
    Luogo
    Lazio
    Post
    1,740
    Blogs
    21
    Quote Originariamente inviato da CC88 Visualizza il messaggio
    .......

    Quindi la domanda, che mi pare semplice: è possibile rendere variabile il nome del campo B in una select?
    codice:
    SELECT A,<nome di colonna variabile> FROM TABELLA
    Messa così, non mi risulta sia possibile.

    Quote Originariamente inviato da CC88 Visualizza il messaggio
    Supponi io abbia impostato 400 colonne, 001, 002, 003, 004, ... , 400 e volessi fare una select che estrae il valore impostato in una riga e volessi rendere random la colonna dalla quale pescare questo valore... Come faccio?
    spero tu non abbia una tabella con 400 colonne
    ... comunque una cosa del genere se le colonne sono di tipo compatibile
    codice:
    select case @random
     when 1 then C001
     when 2 then C002
     ...
     when 400 then C400
    end 
    from Tabella
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  9. #9
    Sgrubak ora è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    418
    Quote Originariamente inviato da sspintux Visualizza il messaggio
    Messa così, non mi risulta sia possibile.
    Tecnicamente si, con sp_executesql.
    Può assegnare il nome della colonna ad una variabile e passarla come parametro.

  10. #10
    Luogo
    Lazio
    Post
    1,740
    Blogs
    21
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Tecnicamente si, con sp_executesql.
    Può assegnare il nome della colonna ad una variabile e passarla come parametro.
    Si lo so , la conosco.

    Ma lui ha chiesto questo:

    "SELECT A,<nome di colonna variabile> FROM TABELLA"

    e non puoi eseguire
    SELECT A, sp_ExecuteSql(...) FROM TABELLA


    sp_ExecuteSql è utile per costruire una query dinamicamente

    E' possibile eseguire:
    Insert into Tabella exec sp_executeSql(....)

    ... ma che te ne fai se il criterio di scelta della colonna da selezionare è variabile
    in funzione di un campo di una tabella nella query ?

    Il fatto è che non si ha una visione completa del problema da risolvere... o almeno io non la ho

    Forse potrebbe andar bene sp_ExecuteSql ... o forse anche altro tipo
    codice:
    insert into ordiniattuali(cdarst,quantita)
    
    select cdarst ,QO01ST as qta 
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in ('12','40')  
    and nrfocc = '03' and timost in(01,07)
    UNION ALL
    select cdarst ,QO02ST as qta 
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in ('12','40')  
    and nrfocc = '03' and timost in(01,07)
    ....
    UNION ALL
    select cdarst ,QO12ST as qta 
    from STGA000F  
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in ('12','40')  
    and nrfocc = '03' and timost in(01,07)
    Oppure , supponendo che tabNumSeq sia una tabella con un campo N con i numeri da 1 a 12 ( comunque simulabile in altri modi)
    si potrebbe anche scrivere una cosa del genere ( non provata)
    codice:
    insert into ordiniattuali(cdarst,quantita)
    select q.cdarst, 
             case tseq 
             when 1 then q.QO01ST
             when 2 then q.QO02ST
             ...          
            when  12 then q.QO12ST
          end
    from
    ( 
    select * from
    STGA000F 
    left join mgart00f on STGA000F.cdarst = mgart00f.cdarma  
    left join coan100f on STGA000F.cdarst = coan100f.cdarcc   
    where annost =  @currentyear and mgart00f.cla5ma in ('12','40')  
    and nrfocc = '03' and timost in(01,07)
    ) q
    cross join tabNumSeq tseq where N<=12
    ... boh!

    ma di sicuro per le performance è generalmente preferibile eseguire operazioni su set di dati che cicli while in T-SQL
    Ultima modifica di sspintux; 02-09-2020 19:58 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi