我想写查询来运行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主机数据文件
我该如何解决这个问题?感谢。
答案 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
括在双引号("
)中。编写命令的方式如果文件名中包含空格,则会失败。