2009-09-29 6 views
2

J'essaie d'utiliser l'utilitaire SQL Server bcp pour importer un fichier texte à partir d'un partage samba. bcp est en train de s'étouffer sur les terminaisons de ligne Unix. Je suis sûr que je pourrais ajouter une étape intermédiaire, soit sur Unix ou Windows, pour changer les fins de ligne en style Windows. Mais je préférerais importer les fichiers d'Unix sans modification.Peut SQL Server bcp dans un fichier avec des fins de ligne Unix?

Quelqu'un sait-il s'il existe un moyen de dire à SQL Server bcp de rechercher des fins de ligne Unix?

Répondre

2

Vous devez utiliser un fichier de format avec bcp et spécifier la terminaison comme \ n. La ligne de commande interactive ajoutera toujours \ r, où un fichier de format utilisera exactement ce que vous spécifiez. Référence http://www.eggheadcafe.com/software/aspnet/32239836/bcp-out-with-char10-as-row-terminator.aspx.

La création d'un fichier de format est assez bien expliquée dans BOL, mais commentez/mettez à jour votre article original si vous avez besoin d'aide.

+0

+1 * une réponse. Le lien BOL à la http://msdn.microsoft.com/en-us/library/ms191485.aspx trop où il mentionne interactif. – gbn

+0

Bumping votre réponse J'espère ... :-) – gbn

+1

Je ne serai pas en mesure de vérifier cela de sitôt, mais il est logique. J'accepte cette réponse basée sur l'approbation de gbn. –

2

avez-vous essayé de définir ROWTERMINATOR = '\ n'?

+0

je peux utiliser le paramètre -r et réglez-le sur \ n, mais qui est la valeur par défaut , donc je ne pense pas que ça va faire du bien. En outre, il est possible qu'il interprète \ n comme le terminateur de ligne spécifique à la plate-forme, ce qui nous donnerait le même problème qu'avant. Est-ce que le paramètre -r de quoi vous parlez? –

+0

http://msdn.microsoft.com/en-us/library/ms188365.aspx, cela signifie que la valeur par défaut est '\ r \ n' qui n'est pas la même chose. – CSharpAtl

+0

OK, je vois. J'utilise l'utilitaire de ligne de commande bcp, pas l'insertion en bloc. Il a différentes options et valeurs par défaut. –

-2

Oui, c'est exaspérant. Ma compréhension est que SQL Server bcp TOUJOURS insère un \ r avant quel terminateur de ligne que vous vous attendez à être utilisé. Donc, si vous n'utilisez pas -r, vous vous attendez à ce qu'il utilise uniquement \ n. Mais ce n'est pas ... il insère bêtement pour pouvoir utiliser \ r \ n. Si vous spécifiez -r \ r \ n, cela ne fonctionnera toujours pas; Je suspecte parce qu'il veut maintenant la fin de la ligne. C'est tout le travail d'un idiot codant pour le monde de Windows essayant de rendre la vie plus facile pour les débutants et finissant par rendre les choses presque impossible pour tout le monde. J'ai rencontré ce problème lors du transfert de fichiers de Sybase vers le serveur SQL et la solution était de spécifier -r \ r \ n dans le bcp out de Sybase (qui fonctionne exactement comme vous le lui demandez!) Et -r \ n (ou juste don n'utilisez pas -r) pour le bcp SQL Server.

+1

Si vous lisez sur bcp, vous savez que cela est documenté et comment le contourner. Je sais, quel idiot ne utilise pas les fichiers de format pour n'importe quoi sauf un simple CSV. Ou utilisez SSIS. – gbn

+0

@gbn, cet idiot était moi! Je vais regarder dans les fichiers de format la prochaine fois. –

2

Je ne pense pas que vous puissiez le faire à partir de la ligne de commande bcp. Mais, je pense que la version SQL suivante fonctionnera.

DECLARE @Command nvarchar(1000) 

SET @Command = N'BULK INSERT MyTable 
FROM ''<path\file>'' 
WITH (ROWTERMINATOR = '''+CHAR(10)+''')' 

exec sp_executeSQL @Command 
+0

L'équivalent de commande BCP que j'ai utilisé pour cela consiste à spécifier le terminateur de ligne en tant que nouvelle ligne, par ex.: '-r 0xa' –

0

Si vous n'avez pas beaucoup de temps pour étudier bcp en détail, consultez celui-ci: http://msdn.microsoft.com/en-us/library/ms190759.aspx

Il vous donnera par exemple facile, expliquer ce que signifient les invites interactives, option pour enregistrer le format une fois vous avez terminé (si vous allez le faire à plusieurs reprises) etc. etc.

Si vos données sont volumineuses et/ou si vous avez plusieurs filds, vous pouvez d'abord faire une table puis faire un petit essai d'export (bcp prendra une sélection simple en tant que premier argument) et choisira toujours des formats interactivement, colonne par colonne. Vous pouvez creuser dans le dernier fichier fmt enregistré si vous avez une raison supplémentaire pour cela.

3

La réponse est simple à utiliser hexadécimal, comme cela a été mentionné dans l'un des commentaires, comme la terminaison de ligne:

-r 0x0a 
Questions connexes