Comment vider toutes nos images d'un champ VARBINARY (MAX) dans SQL Server 2008 vers le système de fichiers?
-
03-07-2019 - |
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?
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.