Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Skript zum Speichern von varbinary-Daten auf der Festplatte

Der BCP-Ansatz funktioniert bei mir nicht. Die Bytes, die es auf die Festplatte schreibt, können nicht wieder in die von mir gespeicherten .net-Objekte deserialisiert werden. Dies bedeutet, dass die Bytes auf der Festplatte nicht dem entsprechen, was gespeichert ist. Vielleicht schreibt BCP eine Art Header. Ich bin mir nicht sicher.

Ich habe den folgenden Code hier am Ende des Artikels gefunden. Es funktioniert großartig! Obwohl es für gespeicherte BMP-Bilder gedacht war, funktioniert es mit jeder varbinary.

DECLARE @SQLIMG VARCHAR(MAX),
    @IMG_PATH VARBINARY(MAX),
    @TIMESTAMP VARCHAR(MAX),
    @ObjectToken INT

DECLARE IMGPATH CURSOR FAST_FORWARD FOR 
        SELECT csl_CompanyLogo from mlm_CSCompanySettingsLocalizations

OPEN IMGPATH 

FETCH NEXT FROM IMGPATH INTO @IMG_PATH 

WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @TIMESTAMP = 'd:\' + replace(replace(replace(replace(convert(varchar,getdate(),121),'-',''),':',''),'.',''),' ','') + '.bmp'

        PRINT @TIMESTAMP
        PRINT @SQLIMG

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

        FETCH NEXT FROM IMGPATH INTO @IMG_PATH 
    END 

CLOSE IMGPATH
DEALLOCATE IMGPATH