0

スレッドがそれ以上の回答を受け取っていないため、この質問のフォローアップとしてこの質問を投稿します。

CLRストアドプロシージャのパラメータとして大量のデータを「0x5352532F...」として渡すことができるかどうかを理解しようとしています。

これは、tiを一時DBフィールドに送信し、そこからvarbinary(max)パラメーターとしてCLRストアード・プロシージャーに渡すのではなく、データをCLRストアード・プロシージャーに直接送信することを回避するためです。

私は三重の質問があります:

1)可能ですか、はいの場合、どのようにですか?PDFファイルをCLRストアドプロシージャに渡したいとしましょう(パスではなく、ファイルを構成する完全なビット)。何かのようなもの:

exec MyCLRStoredProcs.dbo.insertfile
@file_remote_path ='c:\temp\test_file.txt' ,
@file_contents=0x4D5A90000300000004000.... --(this long list is the file content)

ここで、insertfileは、サーバーパス(file_remote_path)に(file_contents)として渡すバイナリデータを書き込むストアドプロシージャです。

2)このアプローチを採用することによる破損のリスクはありますか(またはSQLサーバーが舞台裏で使用するのと同じアプローチです)?

3)ファイルの内容を「0x23423...」16進表現に変換する方法

4

1 に答える 1

2

あなたの目標は何ですか?クライアントファイルシステムからサーバーファイルシステムにファイルを転送しようとしていますか?その場合は、Webサービスのファイル転送メカニズムを確認することをお勧めします。

データをデータベースに永続化しますか?その場合、SQL Server 2008にアクセスできる場合は、新しいFILESTREAMタイプを確認することをお勧めします。このタイプは、データベースとファイルシステム間のリンクを維持します。

または、SQL Server 2008をお持ちでない場合は、ファイルとして保存するか、データベースへの文字列パスを維持するか、ファイルの内容を列に保存するかを選択できますVARBINARY(MAX)

データをデータベースに取り込むだけの場合は、CLRプロシージャは必要ありません。データベースに直接保存することも、SQLストアドプロシージャをコーディングして保存することもできます。

これをCLRプロシージャに送信するアプローチを維持すると仮定します。

1)可能ですか、はいの場合、どのようにですか?

もちろん。あなたが書いたコードは良い例のように見えます。ストアドプロシージャは、文字列をバイトに変換する必要があります。

2)このアプローチを採用することによる汚職のリスクはありますか

ここで何を意味するのかわかりません。SQL Serverは文字列内の文字をランダムに置き換えますか?いいえ。誤って何らかの制限に達した可能性がありますか?はい、おそらく; の最大サイズNVARCHAR(MAX)は2^31-1、つまり2,147,483,647文字です。しかし、私はあなたがそのサイズのPDFを持っているとは思えません。ディスク上のファイルとそのファイルへのデータベースパスの間のリンクが失われる可能性がありますか?はい、しかしFILESTREAMあなたのためにそれの世話をする必要があります。

3)ファイルの内容を「0x23423...」16進表現に変換する方法

これを行う方法については、インターネット上に多くの例があります。これが1つです:

バイト配列を16進文字列に、またはその逆にどのように変換しますか?

于 2010-05-07T13:50:16.873 に答える