views:

477

answers:

5

I'm trying to use the SQL Server bcp utility to import a text file from a samba share. bcp is choking on the Unix line endings. I'm sure I could add an intermediate step, either on Unix or Windows, to change the line endings to Windows-style. But I would prefer to import the files from Unix without modification.

Anybody know if there's a way to tell SQL Server bcp to look for Unix line endings?

+1  A: 

have you tried to set the ROWTERMINATOR = '\n'?

CSharpAtl
I can use the -r parameter and set it to \n, but that's the default, so I don't think it will do any good. Besides, it's possible that it would interpret \n as the platform-specific line terminator, which would give us the same problem as before. Is the -r parameter what you're talking about?
John M Gant
http://msdn.microsoft.com/en-us/library/ms188365.aspx, this says that the default is '\r\n' which is not the same.
CSharpAtl
OK, I see. I'm using the bcp command-line utility, not bulk insert. It has different options and defaults.
John M Gant
A: 

Yes, this is maddening. My understanding is that SQL Server bcp ALWAYS inserts a \r before whatever line terminator you would expect to be used. So, if you don't use -r, you would expect it to use \n only. But it doesn't...it stupidly inserts \r so that it can use \r\n. If you specify -r \r\n then it still won't work; I suspect because it now wants \r\r\n line ends. This is all the work of some idiot coding for the Windows world trying to make life easier for beginners and ending up making things nigh on impossible for everyone else. I experienced this problem when transferring files from Sybase to SQL server and the solution was to specify -r \r\n in the bcp out from Sybase (which works exactly as you ask it to!) and -r \n (or just don't use -r) for the SQL Server bcp in.

dik
If you read up on bcp you'd know this is documented and how to get around it. I maan, what kind idiot doesn't use format files for anything except a simple CSV. Or use SSIS.
gbn
@gbn, that idiot was me! I'll look into format files the next time.
John M Gant
A: 

I don't think you can do this from the bcp command line. But, I think the following SQL version will work.

DECLARE @Command nvarchar(1000)

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

exec sp_executeSQL @Command
bobs
+2  A: 

You have to use a format file with bcp and specify the terminator as \n. The interactive command line will always append \r, where a format file will use exactly what you specify. Reference http://www.eggheadcafe.com/software/aspnet/32239836/bcp-out-with-char10-as-row-terminator.aspx.

Creating a format file is explained pretty well in BOL but comment/update your original post if you need help.

ktharsis
+1 *the* answer. The BOL link to the http://msdn.microsoft.com/en-us/library/ms191485.aspx too where it mentions interactive.
gbn
Bumping your answer I hope... :-)
gbn
I won't be able to verify this anytime soon, but it makes sense. I'm accepting this answer based on gbn's endorsement.
John M Gant
@John M Gant: thank you. I've always understood that you need a format file to override the command prompt settings, bcp being a command line utility. So of course you can't use UNIX row line endings in a Windows command prompt...
gbn
A: 

If you don't have a lot of time to study bcp in great detail, check out this one: http://msdn.microsoft.com/en-us/library/ms190759.aspx

It will give you easy example, explain what interactive prompts mean, option to save format once you are done (if you are going to do this repeatedly) etc. etc.

If your data is big and/or you have several filds you'd like, you can make a table first then do a little trial export (bcp will take a simple select as first arg) and still pick formats interactively, column by column. You can dig into saved fmt file latter if you have some extra reason for that.

ZXX