在存储过程中将文件写入网络驱动器

时间:2012-06-25 19:02:07

标签: sql sql-server

我有一个存储过程,可以使用BCP将文件写入网络驱动器,方法是在数据库服务器上创建映射到另一台服务器上的共享驱动器的临时驱动器。它工作正常,但是,我从最后一个EXEC命令返回一个错误,该命令显示There are open files and/or incomplete directory searches pending on the connection to U:.我猜它正在尝试在写完文件之前执行delete drive命令。如果我在运行proc后运行语句,它将成功删除驱动器。这是proc:

CREATE PROCEDURE dn_ExportFile
    @ServerName varchar(50),
    @ServerPath varchar(500),
    @FileName varchar(100),
    @Query varchar(max),
    @UserName varchar(100),
    @Password varchar(100),
    @Drive varchar(1) = 'U'
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @cmd VARCHAR(8000)

    --Set up virtual drive pointing to desired path
    SET @cmd = 'NET USE ' + @Drive + ': ' + @ServerPath + ' /user:' + @ServerName + '\' + @UserName + ' ' + @Password
    PRINT @cmd
    EXEC xp_cmdshell @cmd

    --Export data using BCP to virtual drive
    SET @cmd = 'BCP "' + @Query + '" QUERYOUT "' + @Drive + ':\' + @FileName + '" -c -t -T'
    PRINT @cmd
    EXEC xp_cmdshell @cmd

    --Delete virtual drive
    SET @cmd = 'NET USE ' + @Drive + ': /delete'
    PRINT @cmd
    EXEC xp_cmdshell @cmd
END

有没有办法成功删除存储过程中的临时驱动器?

1 个答案:

答案 0 :(得分:2)

我怀疑在调用proc仍在范围内时不会发生这种情况。因此,您可以尝试执行以下操作的包装器存储过程:

EXEC dbo.dn_ExportFile ...;

SET @cmd = 'NET USE ' + @Drive + ': /delete';
PRINT @cmd;
EXEC xp_cmdshell @cmd;

否则我仍然认为你在错误的地方做这件事。让调用此过程的程序调用命令并指定路径。