2010-08-18 12 views
6

Supporto un processo ETL che trasforma gli input di file flat in una tabella di database SqlServer. Il codice è quasi al 100% T-SQL e viene eseguito all'interno del DB. Non possiedo il codice e non posso modificare il flusso di lavoro. Posso solo aiutare a configurare l'SQL "traduzione" che prende i dati del file e lo converte in dati di tabella (ne parleremo più avanti).Conversione/trasmissione di una nVarChar con separatore di virgola in decimale

Ora che le rinunce sono fuori strada ...

Uno dei nostri fornitori di file recentemente cambiato il modo in cui rappresentano un importo monetario '12345.67'-'12,345.67'. Il nostro SQL che trasforma il valore assomiglia a SELECT FLOOR(CAST([inputValue] AS DECIMAL(24,10))) e non funziona più. Ad esempio, la virgola spezza il cast.

Dato che devo memorizzare il valore finale come Decimal (24,10) tipo di dati (sì, mi rendo conto che il FLOOR cancella tutte precisione post-decimale-punto - il progettista non era in sintonia con il cliente), cosa posso fare per lanciare questa stringa in modo efficiente? '

Grazie per le vostre idee.

+0

una di queste risposte ha risolto il problema? –

+0

@ KM: sto discutendo di questi suggerimenti con il nostro gruppo DBA ora. Dalla mia parte, l'approccio comune proposto (usando Replace()) sembra funzionare. Aggiornerà presto. – SethO

risposta

7

provare a utilizzare REPLACE (Transact-SQL):

SELECT REPLACE('12,345.67',',','') 

USCITA:

12345.67 

quindi sarebbe:

SELECT FLOOR(CAST(REPLACE([input value],',','') AS DECIMAL(24,10))) 
+0

+1 ... Sostituisci e POI cast, quindi la tua funzionalità originale viene mantenuta. – Fosco

1

questo funziona per me:

DECLARE @foo NVARCHAR(100) 
SET @foo='12,345.67' 

SELECT FLOOR(CAST(REPLACE(@foo,',','') AS DECIMAL(24,10))) 

questo è probabilmente valida solo per le regole di confronto/cultura in cui la virgola non è il separatore decimale (es: Spagnolo)

+0

Hai sollevato un buon punto, David. So che alcuni degli input provengono dall'Europa e dall'Asia - questo potrebbe rovinare qualsiasi manipolazione di stringhe con virgole a stringa vuota. Dovrò seguire il cliente su questo. – SethO

+0

È consigliabile che l'applicazione rilevi le impostazioni locali dell'utente, converti in un decimale digitato, quindi passi al server sql come valore decimale digitato. Il problema scompare – David

1

SELECT FLOOR (CAST(REPLACE([inputValue], ',', '') AS DECIMAL(24,10)))

2

Anche se non necessariamente l'approccio migliore per la mia situazione, ho voluto lasciare una possibile soluzione per uso futuro che abbiamo scoperto durante la ricerca di questo problema.

Sembra che il tipo di dati SqlServer MONEY può essere utilizzato come un cast diretto per le stringhe con una virgola che separa la parte non decimale. Pertanto, se SELECT CAST('12,345.56' AS DECIMAL(24,10)) non riesce, il numero SELECT CAST('12,345.56' AS MONEY) avrà esito positivo.

Un'avvertenza è che il tipo di dati MONEY ha una precisione di 4 posizioni decimali e richiederebbe un cast esplicito per portarlo a DECIMAL, nel caso sia necessario.

Problemi correlati