sql >> Database >  >> RDS >> Sqlserver

Script om varbinaire gegevens op schijf op te slaan

De BCP-aanpak werkt niet voor mij. De bytes die het naar schijf schrijft, kunnen niet worden gedeserialiseerd naar de .net-objecten die ik heb opgeslagen. Dit betekent dat de bytes op de schijf niet gelijk zijn aan wat er is opgeslagen. Misschien schrijft BCP een soort koptekst. Ik weet het niet zeker.

Ik vond de volgende code hier onderaan het artikel. Het werkt geweldig! Hoewel het bedoeld was voor opgeslagen BMP-afbeeldingen, werkt het met elk 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


  1. MySQL Wijzig opgeslagen procedure

  2. Verzamelmethode:BESTAAT Functie in Oracle Database

  3. PL/pgSQL-functies:Een normale tabel met meerdere kolommen retourneren met behulp van een execute-statement

  4. MySQL-shardingbenaderingen?