Comment vider toutes nos images d'un champ VARBINARY (MAX) dans SQL Server 2008 vers le système de fichiers?

StackOverflow https://stackoverflow.com/questions/613154

Question

J'ai une table qui contient un champ IDENTITY et un champ VARBINARY (MAX) . Est-il possible de vider le contenu de chaque champ VARBINARY (MAX) dans le système de fichiers (par exemple. c: \ temp \ images ) ?

Schéma de table:

PhotoId INTEGER NOT NULL IDENTITY
Image VARBINARY(MAX) NOT NULL
DateCreated SMALLDATETIME

Sortie:

c:\temp\images\1.png
c:\temp\images\2.png
c:\temp\images\3.png
... etc...

Quelle est la meilleure façon d’aborder cela?

Était-ce utile?

La solution

Je l'ai compris grâce à cet article ...

SET NOCOUNT ON

DECLARE @IdThumbnail INTEGER,
        @MimeType VARCHAR(100),
        @FileName VARCHAR(200),
        @Sqlstmt varchar(4000)


DECLARE Cursor_Image CURSOR FOR
    SELECT a.IdThumbnail
    FROM tblThumbnail a
    ORDER BY a.IdThumbnail

OPEN Cursor_Image
    FETCH NEXT FROM Cursor_Image INTO @IdThumbnail

    WHILE @@FETCH_STATUS = 0
    BEGIN

        -- Generate the file name based upon the ID and the MIMETYPE.
        SELECT @FileName = LTRIM(STR(@IdThumbnail)) + '.png'

        -- Framing DynamicSQL for XP_CMDshell            
        SET @Sqlstmt='BCP "SELECT OriginalImage 
                      FROM Appian.dbo.tblThumbnail 
                      WHERE IdThumbnail = ' + LTRIM(STR(@IdThumbnail)) +
                      '" QUERYOUT c:\Temp\Images\' + LTRIM(@FileName) + 
                      ' -T -fC:\Temp\ImageFormatFile.txt'
        print @FileName
        print @sqlstmt

        EXEC xp_cmdshell @sqlstmt
        FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
    END

CLOSE Cursor_Image
DEALLOCATE Cursor_Image

S'il vous plaît noter - > Vous devez disposer d’un fichier de format pour la commande BCP. Ceci est le contenu du fichier et je l’ai placé dans c: \ Temp (comme indiqué dans la ligne de commande BCP ci-dessus).

10.0
1
1       SQLIMAGE            0       0       ""   1     OriginalImage                      ""

Note finale sur ce fichier de format .. IL FAUT AVOIR UNE NOUVELLE LIGNE APRES LA DERNIERE LIGNE. sinon, vous obtiendrez une erreur.

Profitez!

Autres conseils

Le plus simple (pour moi) serait d'écrire une petite application .NET qui viderait les champs varbinary dans un fichier.

Si vous êtes opposé à l'utilisation de .NET, vous devriez (je ne l'ai pas encore testé) pouvoir créer une nouvelle colonne de type "VARBINARY (MAX) FILESTREAM". Assurez-vous de disposer également du code "ROWGUIDCOL" correspondant. colonne. Ensuite, vous pouvez (en théorie) faire quelque chose comme:

table UPDATE SET varfilestream_col = varbinary_col

J'espère que ça marche pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top