12

フィールドのあるテーブルがありVARBINARY(MAX)ます(SQL Server 2008 with FILESTREAM

私の要件は、本番環境にデプロイするときに、特定の順序で実行されるSQLスクリプトのグループのみをITチームに提供できることです。私が本番環境で作成している新しいテーブルには、このVARBINARY(MAX)フィールドがあります。通常、新しいテーブルを使用して、CREATE TABLEスクリプトをスクリプト化します。また、使用する必要のあるデータがある場合は、INSERTスクリプトを作成します。それほど複雑ではありません。

しかし、を使用すると、ステートメントVARBINARY(MAX)の生成に使用していたストアドプロシージャは、そのテーブルで失敗します。INSERTそのフィールドを選択し、印刷し、コピーし、16進数に変換するなどしてみました。それに関する主な問題は、フィールド内のすべてのデータが選択されないことです。チェックを行いDATALENGTH([FileColumn])、ソース行に1,004,382バイトが含まれている場合、再挿入時にコピーまたは選択されたデータを取得できる最大値は8000です。したがって、基本的には切り捨てられた(つまり無効な)データです。

どうすればこれをより良くすることができますか?私はこれを狂ったようにグーグルで試しましたが、何かが足りないに違いありません。ファイルシステムにアクセスできないことを忘れないでください。これはすべてスクリプト化する必要があります。

4

4 に答える 4

6

これが 1 回限り (またはめったに) 行わない場合は、次の説明に従って、SSMS ウィザードからデータをスクリプト化してみてください。

http://sqlblog.com/blogs/eric_johnson/archive/2010/03/08/script-data-in-sql-server-2008.aspx

または、これを頻繁に行う必要があり、自動化したい場合は、SQL# SQLCLR ライブラリを試すことができます (これは私が書いたもので、ほとんどが無料ですが、ここで必要な関数は無料ではありません)。これを行う関数はDB_DumpDataINSERTであり、ステートメントも生成します。

ただし、これが 1 回限りのタスクまたはまれなタスクである場合は、Management Studio に組み込まれているデータ エクスポート ウィザードを試してください。これにより、本番環境で実行できる SQL スクリプトを作成できるようになります。3,365,964 バイトのデータを含むフィールドを持つテーブルでこれをテストしたところVARBINARY(MAX)、Generate Scripts ウィザードは、INSERTその 1 つの値に対して 673 万文字の 16 進文字列全体を含むステートメントを生成しました。

更新:
INSERT ステートメント全体を SQL スクリプトにコピー/貼り付けでき、BCP や SSMS エクスポート ウィザードを気にする必要がない方法でこれを行うもう 1 つの迅速かつ簡単な方法は、値を に変換することXMLです。最初に、「0x」で始まる 16 進文字列を与えるオプションのスタイル「1」を使用しCONVERTますVARBINARYVARCHAR(MAX)バイナリ データの 16 進文字列を取得したら、それをINSERTステートメントに連結できます。その全体を に変換するとXML、フィールド全体を含めることができますVARBINARY。次の例を参照してください。

DECLARE @Binary VARBINARY(MAX) = CONVERT(VARBINARY(MAX),
                                         REPLICATE(
                                           CONVERT(NVARCHAR(MAX), 'test string'),
                                           100000)
                                        )

SELECT 'INSERT INTO dbo.TableName (ColumnName) VALUES ('+
       CONVERT(VARCHAR(MAX), @Binary, 1) + ')' AS [Insert]
FOR XML RAW;
于 2011-04-12T04:08:22.737 に答える
5

SSMS からスクリプトを作成しない

データのアウト/インをbcpするか、 SSMS ツールなどを使用して INSERT ステートメントを生成します

于 2011-04-12T05:04:32.357 に答える
1

少しめちゃくちゃですが、過去とウェブで、これが base64 でエンコードされた文字列を使用して行われているのを見てきました。xml 値を使用して文字列をラップし、そこから varbinary に変換できます。例を次に示します:
http://blogs.msdn.com/b/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx

ただし、特に大きな値の場合、これがどれほど効果的またはパフォーマンスが高いかについて個人的に話すことはできません. これはせいぜい醜いハックであるため、UDF のどこかに隠しておき、より良い方法が見つかった場合は簡単に更新できるようにします。

于 2011-04-12T04:19:29.500 に答える
0

これまでにこのようなことを試したことはありませんが、SQL Server 2008 R2 のドキュメントから、SUBSTRINGを使用すると varbinary 値全体を取得できるように思えますが、UPDATEを .データを追加する WRITE 句。

大きな値のデータ型の更新

.WRITE (expression, @Offset, @Length) 句を使用して、varchar(max)、nvarchar(max)、および varbinary(max) データ型の部分的または完全な更新を実行します。たとえば、varchar(max) 列の部分的な更新では、列の最初の 200 文字のみが削除または変更される可能性がありますが、完全な更新では、列内のすべてのデータが削除または変更されます。

最高のパフォーマンスを得るには、データを 8040 バイトの倍数のチャンク サイズで挿入または更新することをお勧めします。

お役に立てれば。

于 2011-04-12T03:34:12.160 に答える