88 messaggi dal 19 ottobre 2012
Ciao a tutti,
ho un problema che mi assilla da diversi giorni. Ho necessità di convertire da varchar a int i valori di una colonna ma la conversione mi restituisce tutti valori null.
Questa è la query diconversione

DECLARE @ChiaveCliente VARCHAR(50);
select @ChiaveCliente = CONVERT(INT, CONVERT(VARCHAR(12), chiavecliente)) from miatabella

se eseguo

select @ChiaveCliente from miatabella

come risultato mi da tutti null

Che può essere?
Lo stesso problema ho nel convertire un valore varchar in datetime 105

Spero possiate aiutarmi
Grazie

Giorgio
1.976 messaggi dal 27 luglio 2005
Contributi
salve,

presupponiamo una tabella simile a
SET NOCOUNT ON;
GO
USE tempdb;
GO
CREATE TABLE miatabella (
  id int,
  chiavecliente varchar(12) NULL
  );
INSERT  INTO miatabella
  VALUES ( 1, '12345' ), ( 2, '23456' )
    , ( 3, 'da errore' )
    --, ( 4, '9999' )
    , ( 5, NULL )
    ;
GO


e come puoi vedere, la riga 3 NON sara' convertibile in un intero, mentre la riga 5 e' NULL


1) di base, la tua query, vuole caricare una variabile varchar da una conversione ad intero... in ogni caso avresti ancora un varchar e NON un intero, quindi qualche cosa non mi e' chiaro
2) la tua query, scritta senza filtro WHERE, fa si che, per tutte le righe proiettate venga caricata (e sovrascritta ad ogni iterazione) la variabile @ChiaveCliente, che quindi alla fine della proiezione conterra' l'ultimo valore recuperato (se disponibile e convertibile)

per capirci:
PRINT 'fail';
PRINT '';

DECLARE @ChiaveCliente VARCHAR(50);
PRINT 'nella tua query originale, chiavecliente, da come indicato nel testo, e'' gia'' un varchar, quindi la doppia conversione dovrebbe essere inutile';
PRINT 'SELECT @ChiaveCliente = CONVERT(INT, CONVERT(VARCHAR(12), chiavecliente)) FROM miatabella';

PRINT '';
PRINT 'la sola conversione a int puo'' fallire se il valore non e'' convertibile';

SELECT @ChiaveCliente = CONVERT(INT, chiavecliente)
  FROM miatabella;

GO
PRINT '';
PRINT '---------------------------------------';
PRINT 'fail2:  causa impossibile convertire l''ultima riga, visto che non e'' specificato un filtro, tra l''altro viene eseguita l''operazione su tutte le righe della tabella e viene caricato @ChiaveCliente con l''ultimo valore recuperato, se presente e convertibile.';
DECLARE @ChiaveCliente VARCHAR(50);

SELECT @ChiaveCliente = TRY_PARSE(chiavecliente AS int )
  FROM miatabella;

SELECT @ChiaveCliente;
GO
PRINT '';
PRINT '---------------------------------------';
PRINT 'in ogni caso, DEVI specificare un filtro per ottenere il valore della sola riga a te interessante;';
PRINT 'se questo valore e'' convertibile, con TRY_PARSE ne otterrai il valore, diversamente avrai  NULL';
DECLARE @ChiaveCliente VARCHAR(50);

SELECT @ChiaveCliente = TRY_PARSE(chiavecliente AS int )
  FROM miatabella
  WHERE id = 3;

SELECT @ChiaveCliente;
GO

DROP TABLE miatabella;


tendenzialmente quindi, usando sicuramente un filtro sulla riga che vuoi in effetti avere, potresti ottenere uno dei seguenti risultati:
- la valorizzazione se la colonna in questione e' convertibile in un intero
- NULL se il valore non e' convertibile o non presente (NULL)

non mi resta comunque "chiaro", a questo punto, cosa

... Ho necessità di convertire da varchar a int i valori di una colonna...

in quanto, ripeto, stai utilizzando e caricando una variabile locale di tipo varchar(50), che NON e' un int...

salutoni

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
88 messaggi dal 19 ottobre 2012
Grazie Andrea innanzitutto della risposta e dei chiarimenti su alcuni aspetti.
Ti spiego più in concreto perchè mi serve questa conversione. Ho una SP piuttosto complessa che va in join con diverse tabelle e un campo di questi è chiavecliente che in una tabella è un campo varchar e in un altro è int. Eseguendo solo la parte di questa query ho visto che è di una lentezza estrema, poi cercando di capire il problema ho trovato un forum con la variabile che ho indicato precedentemente e ho visto che velocizzava ma poi facendo la prova ho visto che restituiva nulla di quello che mi serviva.
Ho altri 2 problemi simili, ovvero uno che devo convertire in varchar un campo int e l'altro devo convertire un varchar in datetime
Ora provo con il TRY_PARSE
88 messaggi dal 19 ottobre 2012
Buongiorno Andrea, con il TRY_PARSE e le condizioni aggiunte che mi servono funziona tutto
Grazie


(ho appena inserito un altro problema che ho in un nuovo post. Spero avrai il tempo di dare un'occhiata. Un saluto. Giorgio)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.