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