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

How can I save SQL Server BCP queryout result into the local network share folder?

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

为此,我将本地网络中另一台电脑的共享文件夹映射到我的驱动器。该驱动器名称是 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"  '

我收到这个错误:

unable to open BCP host data file

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

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

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

跳出以下错误:

  • 双引号 (") 在您的查询中未转义。你需要把它们加倍。在您的查询中,"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 括在双引号 (") 中。您的命令编写方式,如果文件名中有空格,它将失败。