Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Script pour enregistrer les données varbinary sur le disque

L'approche BCP ne fonctionne pas pour moi. Les octets qu'il écrit sur le disque ne peuvent pas être désérialisés dans les objets .net que j'ai stockés. Cela signifie que les octets sur le disque ne sont pas équivalents à ce qui est stocké. Peut-être que BCP écrit une sorte d'en-tête. Je ne suis pas sûr.

J'ai trouvé le code suivant ici au bas de l'article. Cela fonctionne très bien ! Bien qu'il ait été conçu pour les images BMP stockées, il fonctionne avec n'importe quel 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