7
votes

SQL Server Bulk Insert - Insertion des valeurs DateTime

J'ai 6 millions de rangées de données que je veux insérer dans ma base de données SQL Server. Je peux le faire de manière lente avec 6 millions d'instructions d'insertion (par mon calcul, il faudrait 18 heures à courir) ou je peux essayer d'essayer un insert en vrac.

insert en vrac a des problèmes de ne pas pouvoir échapper aux caractères, mais les données de Ce cas est très simple et ne devrait donc pas courir dans ce problème. p>

Cependant, SQL Server ne semble pas être une forme de données de date / heure à insérer dans un champ. p> Voici la table (PSEDO-SQL) P>

1000    1092    01/01/2010 04:00:17    01/01/2010 04:00:17        01/01/2010 04:00:14\0


0 commentaires

3 Réponses :


1
votes

Vous avez votre CodDePage code> défini sur RAW code> (probablement à la vitesse).

Le message d'erreur implique que vos données contiennent des caractères en dehors du code de code. P>

CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ]


4 commentaires

Je reçois la même erreur quelles que soient les options CodePage et DatafileType. La "colonne manquante" entre les deux dates représente une valeur nulle dans la colonne planifiée pour.


Je sais que cela représente une valeur nulle! Je dis que Bulk Insert s'attend à ce que toutes les valeurs soient là à moins que vous utilisiez un fichier de format.


Je ne pourrai pas essayer l'option de fichier de format pendant un moment, mais j'essayais votre suggestion de créer une table d'avion (en utilisant uniquement de simples types de fichiers Varchar / int). Je ne reçois pas l'erreur de conversion, mais maintenant je continue à obtenir "la charge en vrac: une fin de fichier inattendue a été rencontrée dans le fichier de données". Indépendamment de l'endroit où je mets le terminateur de ligne. Argh. (MySQL est tellement plus simple à cet égard, ce qui donne, Microsoft?)


@David: "Fin de fichier inattendu" est peut-être parce que l'insert en vrac s'attend à ce que toutes les colonnes soient là pour chaque ligne.



6
votes

Il s'avère que la modification du datafileType de "natif" à "char" a résolu le problème. Le type «natif» implique un format de données strict pour tout, tandis que 'Char' est destiné à plus de fichiers plaintes.


1 commentaires

Overflow de pile dit que je ne peux accepter ma propre réponse après 48 heures. Merci pour votre aide plus tôt, BTW.



0
votes

Une méthode que je connaisse est d'insérer vos dates sous la forme d'un entier.

J'utilise le nombre de secondes à partir d'une certaine date (j'utilise un sur 10 ans dans le passé, car il n'y a pas de données, j'aurais accès ou générer cela est plus âgé que celui-ci)

La date 2012-01-02 12: 15: 10.000 serait stockée sous 378637886, en utilisant le point de référence du 1er janvier 2000.

Lors de la mise en place de la base de données, vous pouvez avoir la colonne renvoyée à l'aide de daadd (SS, Nom de colonne, '2000-01-01').

Vous pouvez aussi faire cela en milliesecondes si ce type de précision était nécessaire.

J'utilise ma propre fonction personnalisée pour convertir mon temps en quelques secondes dans le format que je voudrais, et j'utilise une autre fonction personnalisée pour reculer les dates en secondes.

Je me rends compte que cela peut ne pas être une bonne méthode car elle pourrait nécessiter des modifications de base de données et des changements de code pour vous, mais peut-être peut-être être un concept de solution que d'autres trouveraient utiles.


0 commentaires