この質問のフォローアップとしてこの質問をします。
bcpとxp_cmdshellを使用するソリューションは、私の望ましいソリューションではありませんが、ここに投稿されています。
とにかく、私はc#を初めて使用します(Delphi開発者であるため)。チュートリアルに従うことで、簡単なCLRストアドプロシージャを作成できました。
私の仕事は、ファイルをクライアントファイルシステムからサーバーファイルシステムに移動することです(サーバーにはリモートIPを使用してアクセスできるため、共有フォルダーを宛先として使用できません。そのため、CLRストアドプロシージャが必要です)。
だから私はするつもりです:
- Delphiから一時テーブルのvarbinary(max)列にファイルを保存します
- CLRストアドプロシージャを呼び出して、varbinary(max)フィールドに含まれるデータを使用して目的のパスにファイルを作成します
C:\ MyFile.pdfをZ:\ MyFile.pdfに移動する必要があるとします。ここで、C:はローカルシステムのハードドライブであり、Z:はサーバーのハードドライブです。Cはニューヨークにあり、Zはロンドンにあり、それらの間にVPNはなく、https接続だけです。
誰かがそれを機能させるために変更できる(機能していない)以下のコードを提供しますか?ここでは、ID(int)とDATA(varbinary(max))の2つのフィールドを持つMyTableというテーブルがあると仮定します。テーブルが実際の一時テーブルであるか、データを一時的に保存するテーブルであるかは、違いがないことに注意してください。いくつかの例外処理コードがあれば幸いです(「ファイルを保存できません」という例外を管理できるようにするため)。
新しいファイルを書き込んだり、既存のファイルを上書きしたりできるようにしたいと思います。
[Microsoft.SqlServer.Server.SqlProcedure]
public static void VarbinaryToFile(int TableId)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand("select data from mytable where ID = @TableId", connection);
command.Parameters.AddWithValue("@TableId", TableId);
// This was the sample code I found to run a query
//SqlContext.Pipe.ExecuteAndSend(command);
// instead I need something like this (THIS IS META_SYNTAX!!!):
SqlContext.Pipe.ResultAsStream.SaveToFile('z:\MyFile.pdf');
}
}
(1つのサブ質問は次のとおりです。このアプローチは正しいですか、それともデータをCLRストアドプロシージャに直接渡す方法があるので、一時テーブルを使用する必要はありませんか?)
サブ質問の答えが「いいえ」の場合、一時テーブルを回避する方法を説明してください。それで、私が上で説明したもの(=一時テーブル+ストアドプロシージャ)よりも良い方法はありますか?クライアントアプリケーションからCLRストアドプロシージャにデータストリームを直接渡す方法はありますか?(私のファイルは任意のサイズにすることができますが、非常に大きくすることもできます)