如何在不使用本地或临时文件的情况下直接将存储过程输出写入FTP上的文件?

时间:2008-08-21 17:21:21

标签: sql-server sql-server-2005 ssis ftp

我想获取存储过程的结果,并将它们放入CSV文件到FTP位置。

但问题是,我无法创建一个本地/临时文件,然后我可以FTP。

我采用的方法是使用SSIS包创建一个临时文件,然后在包中使用FTP任务来FTP文件,但是我们的DBA不允许在任何服务器上创建临时文件。 / p>

in reply to Yaakov Ellis

我认为我们需要说服DBA让我至少在他们不运营的服务器上使用一个共享,或者询问他们将如何操作。

in reply to Kev

我喜欢CLR集成的想法,但我不认为我们的DBA甚至不知道那是什么 lol ,他们也许不会允许它。但我可能会在可以安排的SSIS包中的脚本任务中执行此操作。

6 个答案:

答案 0 :(得分:14)

答案 1 :(得分:9)

如果您被允许实现CLR集成程序集,您实际上可以使用FTP而无需编写临时文件:

public static void DoQueryAndUploadFile(string uri, string username, string password, string filename)
{
    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(uri + "/" + filename);
    ftp.Method = WebRequestMethods.Ftp.UploadFile;
    ftp.Credentials = new System.Net.NetworkCredential(username, password);

    using(StreamWriter sw = new StreamWriter(ftp.GetRequestStream()))
    {
        // Do the query here then write to the ftp stream by iterating DataReader or other resultset, following code is just to demo concept:
        for (int i = 0; i < 100; i++)
        {
            sw.WriteLine("{0},row-{1},data-{2}", i, i, i);
        }
        sw.Flush();
    }
}

答案 2 :(得分:1)

您可以在任何地方使用服务器来创建临时文件吗?如果是这样,请创建一个返回包含该文件内容的数组的Web服务。从可以创建临时文件的计算机调用Web服务,使用该数组的内容构建临时文件并将其翻转过来。

如果根本没有,你可以在哪里创建一个临时文件,我看不出你如何通过FTP发送任何内容。

答案 3 :(得分:0)

尝试使用CLR存储过程。您可能会想出一些东西,但如果没有先创建临时文件,它可能仍然很难。你可以在另一台机器上设置共享并写入,然后从那里ftp吗?

答案 4 :(得分:0)

来自FTP服务器的脚本,只需调用存储过程。

答案 5 :(得分:0)

  

但问题是我无法创造   一个本地/临时文件,然后我可以FTP。

这个限制没有任何意义,试着很好地与DBA交谈并向他/她解释。任何Windows进程或作业在适当的位置创建临时文件(即%TEMP%文件夹)是完全合理的。实际上,SSIS运行时本身经常在那里创建临时文件 - 所以如果DBA允许你运行SSIS,那么 允许你创建临时文件:)。

只要DBA明白这些临时文件不会给他造成问题或额外的工作量(解释他必须设置特殊权限,或者备份它们等),他应该同意让你创造它们。

DBA的唯一维护任务是定期清理%TEMP%目录,以防SSIS作业失败并使文件落后。但无论如何他应该这样做,因为许多其他过程也可能这样做。一个简单的SQL代理作业就是这样做的。