2

テーブルにさまざまな種類のファイル (txt、doc、jpg など) があり、それらをすべてファイル システムに保存したいと考えています。私はファイルごとにそれを行う方法を知っていますが、それは役に立ちません。すべてのファイルを正しい拡張子で一度に保存するループを実行する必要があります。何かアドバイス?

私は今このようにしています:

DECLARE @ObjectToken INT
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod @ObjectToken, 'Open'
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, <this is where binary data goes>
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, 'd:/file.txt', 2
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken

それで、私の質問は、一度にdbテーブルのすべてのレコード(すべてのファイルを保存)に対してこれを行う方法と、保存されたすべてのファイルに正しいファイル拡張子を設定する方法があるでしょうか?

4

2 に答える 2

4

コメントで言及したコードに基づいて、SQL Server 2005 以降を使用していると仮定すると、このソリューションはうまくいくはずです。

DECLARE 
    @FileContent VARBINARY(MAX),
    @FileName VARCHAR(MAX),
    @ObjectToken INT,
    @FileID BIGINT

DECLARE cFiles CURSOR FAST_FORWARD FOR
SELECT Id, FileName, Image_Data from MyFileTable
OPEN cFiles

FETCH NEXT FROM cFiles INTO @FileID, @FileName, @FileContent

WHILE @@FETCH_STATUS = 0 BEGIN

    -- CHOOSE 1 of these SET statements:

    -- if FileName is unique, then just remove special characters
    SET @FileName = REPLACE(REPLACE(@FileName, '\', ' '), ':', ' ')
    -- if FileName without path information is unique
    SET @FileName = SUBSTRING(@FileName,
        len(@FileName)+2-CHARINDEX('\',REVERSE(@FileName)),len(@FileName))
    -- if you just take ID + extensions
    SET @FileName = 'c:\path\to\' + CAST(@FileID AS varchar) + 
        SUBSTRING(@ap_description,len(@ap_description)+1
            -CHARINDEX('.',REVERSE(@ap_description)),len(@ap_description))

    EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1
    EXEC sp_OAMethod @ObjectToken, 'Open'
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @FileContent
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FileName, 2
    EXEC sp_OAMethod @ObjectToken, 'Close'
    EXEC sp_OADestroy @ObjectToken

    FETCH NEXT FROM cFiles INTO @FileID, @FileName, @FileContent
END

CLOSE cFiles
DEALLOCATE cFiles

image自動的に にキャストされvarbinary(max)ます。

( '\'SO 構文の強調表示を中断します。)

于 2013-03-19T18:33:23.340 に答える
1

問題を解決しました。SQL Server 2000 から 2005 に db を移行するのは本当に簡単ではないことがわかりました。有効な唯一の解決策はこれです - http://tek-works.com/fixing-there-is-already-an-object-named- sysnsobjs-in-the-database/

これらの手順を完了したら、互換性レベルを 90 に設定するだけです。 (データベースを右クリック > プロパティ > 互換性レベル)

次に、VARBINARY(MAX) を使用して、完全なイメージ データ型のバイナリ ファイルをファイル システムに保存できます。

移住頑張ってください!

于 2013-03-29T08:49:03.280 に答える