SQLBulkCopy e Date (1/1/1753)

ado.net datetime sqlbulkcopy sql-server

Domanda

Ho un'applicazione che sta funzionando bene da un po ', ma c'è un elemento fastidioso che continua a intromettersi in occasione.

Diciamo che uso un oggetto come OracleDataReader o MySQLDataReader per passare i dati all'oggetto sqlbulkcopy per l'inserimento. Supponiamo che tutte le colonne siano mappe perfette e, per la maggior parte, tutto funzioni bene.

Certo, non ho il controllo dell'applicazione o del database di origine (che è MySQL o Oracle). Quindi un pasticcio entra in un'altra applicazione e inserisce una data nella tabella delle fatture del 31/05/0210. Voleva davvero inserirlo nel 31/05/2010, ma l'applicazione che sta utilizzando non convalida i dati molto strettamente e il database Oracle lo accetta. Per tutti gli scopi intensivi, i dati del 31/05/0210 sono una data valida per Oracle db. Potrebbe essere stupido in termini di inserimento dei dati, ma è ciò che è a questo punto.

Ora il nostro OracleDataReader arriva e sta trasferendo questa tabella delle fatture su SQL Server tramite SQLBulkCopy. Sta trasmettendo i dati alla tabella perfettamente abbinata con i nomi delle colonne e i tipi di dati corretti. Puoi vedere cosa sta per succedere. Questa data del 31/05/0210 da Oracle non viene accettata dal motore db di SQL Server, poiché il campo DATETIME consente solo date dal 1/1/1753 al 31/12/9999.

Quando incontra questo record, fallisce semplicemente e dà un errore di overflow. Non salta il record, uccide il feed. Quindi se succede un migliaio di record su un milione di record, non si ottengono i restanti 999.000 record.

Esiste comunque un modo per ovviare a questo problema in modo che il feed continui?

Idealmente, mi piacerebbe spostare il DB SQL Server ricevente al 2008 e utilizzare DATETIME2, che consentirebbe queste date sciocche, ma sfortunatamente non tutti i miei client sono pronti a passare a questa versione ancora, quindi sono bloccato con DATETIME in SQL 2000/2005/2008.

Qualche idea su come aggirare questo senza cambiare SQL? Idealmente, non mi dispiacerebbe se saltasse il record. So che potrei farlo in SQL per il datareder, ma questo sarebbe estremamente complicato quando hai venti campi data in una singola query. Sarebbe un incubo di manutenzione.

Ogni pensiero sarebbe apprezzato.

Risposta popolare

Un'opzione sarebbe quella di cambiare il tipo di colonna datetime in varchar. Quindi aggiungere una colonna derivata per la conversione della stringa in data / ora. Il trucco sarebbe utilizzare una funzione nella colonna derivata per convalidare la data e inserire un datetime arbitrario se la cover fallirà. Se fai paragoni con date pesanti, continua la colonna calcolata e / o indicizzala.

Dico tutto questo con l'impressione che sqlbulkcopy non è in grado di fare trasformazioni. Forse puoi. Si spera che qualcuno vi confermi un modo per farlo.

SSIS sarebbe fantastico in questa situazione, come si potrebbe fare la trasformazione e ottenere anche i benefici delle prestazioni del blocco di aggiornamento di massa.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow