如何将SQL Server BCP查询结果保存到本地网络共享文件夹中?

时间:2016-02-16 10:56:01

标签: sql-server sql-server-2008 sql-server-2012 bcp xp-cmdshell

我想写查询来运行BCP实用程序并将查询结果保存到网络共享文件夹中。

为此,我将本地网络中另一台pc的共享文件夹映射到我的驱动器。该驱动器名称为z。在我的资源管理器中,它显示了映射的驱动器。打开该驱动器并且我可以完全控制它,但是当我运行此查询时:

EXEC xp_cmdshell 'bcp "SELECT  "028",rtrim(ltrim(anumber)),rtrim(ltrim(bnumber)),rtrim(ltrim(duration))  FROM [myTestReport].[dbo].[CDR]"  queryout z:\beh.csv -S DESKTOP-A5CFJSH\MSSQLSERVER1 -Umybehzad -Pbeh1368421 -f "f:\myFORMAT.fmt"  '

我收到此错误:

  

无法打开BCP主机数据文件

我该如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:0)

您正在SQL Server上运行BCP,它无法查看映射在本地PC上的驱动器。如果您在客户端上安装了SQL Server客户端工具(包括BCP),只需从命令行运行BCP命令。

如果必须通过服务器上的xp_cmdshell运行BCP,则使用的帐户必须具有网络共享和基础文件系统的权限。如果您是sysadmin角色成员,那么这将是SQL Server服务帐户,对于非sysadmin用户,这将是xp_cmdshell proxy account。在这种情况下,您应该指定UNC路径而不是映射驱动器。

答案 1 :(得分:0)

以下错误跳出来:

  • 在您的查询中使用双引号(")未转义。你需要加倍。在您的查询中,"028"需要成为""028""

突出显示此功能的工作示例(在我的环境中测试):

DECLARE @cmd VARCHAR(8000);
SET @cmd='BCP "SELECT ""028""" QUERYOUT "C:\Temp\test.txt" -c -T -S ' + @@SERVERNAME + ' -d ' + DB_NAME();
EXEC master.sys.xp_cmdshell @cmd;

请注意,通常最好将data_file括在双引号(")中。编写命令的方式如果文件名中包含空格,则会失败。