在远程服务器中执行BCP命令

时间:2014-04-02 10:00:22

标签: sql-server

我在远程服务器上执行BCP命令时遇到问题。

我在批处理文件中执行以下命令,该文件执行脚本文件。 脚本文件处理临时表并将临时表中的记录写入文件。

SQLCMD -SQA_Server236 -dtestdb -Usa -PPassword1  -i"D:\script\Writing to Files\Write to CSV.sql" -o"D:\script\script_logs.log"

- 脚本文件包含...

declare @table    NVARCHAR(255)  
declare @filename VARCHAR(100)  
set @filename='C:\TextFile\abcd.csv'
set @table ='##Indexes_Add'




  IF OBJECT_ID('tempdb..#Indexes_Add') IS NOT NULL
    BEGIN
    DROP TABLE ##Indexes_Add
    END 


 CREATE TABLE  ##Indexes_Add
(
    id int IDENTITY(1,1) PRIMARY KEY,
    alter_command NVARCHAR(MAX),
    successfully_readded BIT NULL,
 )

  insert into ##Indexes_Add select 'a',0
  insert into ##Indexes_Add select 'a',0
  SET NOCOUNT ON;

  IF OBJECT_ID('tempdb..'+@table) IS NOT NULL
  BEGIN
    DECLARE 
        @sql NVARCHAR(MAX), 
        @cols NVARCHAR(MAX) = N'';


       SELECT @cols += ',' + name
      FROM tempdb.sys.columns
      WHERE [object_id] = OBJECT_ID('tempdb..'+@table)
      ORDER BY column_id;




    SELECT @cols = STUFF(@cols, 1, 1, '');




    SET @sql = N'EXEC master..xp_cmdshell ''bcp "SELECT ''''' 
        + REPLACE(@cols, ',', ''''',''''') + ''''' UNION ALL SELECT ' 
        + 'RTRIM(' + REPLACE(@cols, ',', '),RTRIM(') + ') FROM ' 
       + 'tempdb.dbo.'+@table + '" queryout "' + @filename + '" -c -t, -SQA_Server236 -Usa -PPassword1''';  



  EXEC sp_executesql @sql;
    print @sql

    END

我的问题 - :

当我在批处理文件中运行上述批处理命令并且我给我的本地服务器而不是服务器名称“QA_Server236”时,我得到了在我的系统中创建的文件“abcd.csv”但是当我将服务器名称作为“QA_Server236”文件在远程机器中创建,即QA_Server236。但我希望在我的系统中创建文件,如果给定服务器是远程服务器说“QA_Server236”

任何人都可以帮我解决这个问题。我没有任何方法可以这样做。

1 个答案:

答案 0 :(得分:0)

如果我是对的,BCP不允许将结果集和/或日志保存到远程计算机。但您可以尝试将远程PC上的文件夹挂载到本地计算机上的共享文件夹并在那里设置输出位置,或者尝试使用网络路径&#34; \ [YOURPC] ....&#34;。< br />由于我不确定它是否有效(实际上,我认为它不会),这是我能想到的唯一解决方案:在您的批次中添加一行BCP完成执行后,将文件从远程机器移动到PC(xcopy或类似文件)(批量生成,执行#34;调用bcp.exe [params]&#34;而不仅仅是&#34; ; bcp.exe ...&#34;)

希望这有帮助!