可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Below is an example of the BCP Statement. I'm not accustomed to using BCP so your help and candor is greatly appreciated
I am using it with a format file as well.
If I execute from CMD prompt it works fine but from SQL I get the error. The BCP statement is all on one line and the SQL Server Agent is running as Local System. The SQL server, and script are on the same system.
I ran exec master..xp_fixeddrives C,45589 E,423686
I've tried output to C and E with the same result
EXEC xp_cmdshell 'bcp "Select FILENAME, POLICYNUMBER, INSURED_DRAWER_100, POLICY_INFORMATION, DOCUMENTTYPE, DOCUMENTDATE, POLICYYEAR FROM data.dbo.max" queryout "E:\Storage\Export\Data\max.idx" -fmax-c.fmt -SSERVERNAME -T
Here is the format file rmax-c.fmt
10.0 7 1 SQLCHAR 0 255 "$#Y#$" 1 FILENAME 2 SQLCHAR 0 40 "" 2 POLICYNUMBER 3 SQLCHAR 0 40 "" 3 INSURED_DRAWER_100 4 SQLCHAR 0 40 "" 4 POLICY_INFORMATION 5 SQLCHAR 0 40 "" 5 DOCUMENTTYPE 6 SQLCHAR 0 40 "" 6 DOCUMENTDATE 7 SQLCHAR 0 8 "\r\n" 7 POLICYYEAR
Due to formating in this post the last column of the format file is cut off but reads SQL_Latin1_General_CP1_CI_AS
for each column other that documentdate.
回答1:
First, rule out an xp_cmdshell issue by doing a simple 'dir c:*.*';
Check out my blog on using BCP to export files.
I had problems on my system in which I could not find the path to BCP.EXE.
Either change the PATH variable of hard code it.
Example below works with Adventure Works.
-- BCP - Export query, pipe delimited format, trusted security, character format DECLARE @bcp_cmd4 VARCHAR(1000); DECLARE @exe_path4 VARCHAR(200) = ' cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ & '; SET @bcp_cmd4 = @exe_path4 + ' BCP.EXE "SELECT FirstName, LastName FROM AdventureWorks2008R2.Sales.vSalesPerson" queryout ' + ' "C:\TEST\PEOPLE.TXT" -T -c -q -t0x7c -r\n'; PRINT @bcp_cmd4; EXEC master..xp_cmdshell @bcp_cmd4; GO
Before changing the path to \110\ for SQL Server 2012 and the name of the database to [AdventureWorks2012], I received the following error.
After making the changes, the code works fine from SSMS. The service is running under NT AUTHORITY\Local Service. The SQL Server Agent is disabled. The output file was created.
回答2:
Does the output path exist? BCP does not create the folder before trying to create the file.
Try this before your BCP call:
EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
回答3:
Please check, the file might be opened in another application or program. If it is the case, bcp.exe cannot overwrite the existing file contents.
回答4:
In my case, I solved The problem in the following way:
my command was :
bcp "select Top 1000 * from abc.dbo.abcd" queryout FileNameWithDirectory -c -t "|" -r "0x0a" -S 192.111.1.111 -U xx -P xxxxx
My FileNameWithDirectory was too long. like "D:\project-abc\R&D\abc-608\FilesNeeded\FilesNeeded\DataFiles\abc.csv"
.
I change into a simpler directory like : "D:\abc.csv"
Problem solved.
So I guess the problem occurred due to file name exceeding. thus the file was not found.
回答5:
If it works from the command line but not from the SQL Agent, I think it is an authentication issue.
The SQL Server Agent is running under a account. Make sure that the account has the ability to read the format file and generate the output file.
Also, make sure the account has the ability to execute the xp_cmdshell stored procedure.
Write back with your progress ...
回答6:
Remove no_output from your command, if you use one offcourse
SET @sql = 'BCP ....' EXEC master..xp_cmdshell @sql , no_output EXEC master..xp_cmdshell @sql
回答7:
In my case this fix was simply running in administrator mode.