Stocker simplement tout types de fichiers dans une table en utilisant le type de données VARBINARY et les BLOBs

Voici comment copier le contenu d’un fichier contenu sur un disque dur pour le stocker dans une table, à l’aide de la commande OPENROWSET et de son option BULK …

Supposons que nous avons la table suivante, dans laquelle nous stockons des icônes :

1
2
3
4
5
6
7
8
9
---------------------------------
-- Nicolas SOUQUET - 26/06/2009 -
---------------------------------
CREATE TABLE dbo.TbIcone
(
  IDIcone INT IDENTITY CONSTRAINT PK_TbIcone PRIMARY KEY,
  nomIcone VARCHAR(255) NOT NULL,
  icone VARBINARY(MAX)
)

Et voici la procédure stockée qui va permettre de stocker des icônes stockées sur un des disques dur, simplement en passant son UNC en paramètre :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
---------------------------------
-- Nicolas SOUQUET - 26/06/2009 -
---------------------------------
CREATE PROCEDURE PsStockeIcone
  @cheminDuFichier VARCHAR(255)
AS
BEGIN
  SET NOCOUNT ON
 
  DECLARE @SQL NVARCHAR(256),
      @ParamDefinition NVARCHAR(64),
      @nomDeFichier VARCHAR(64)
 
  SELECT @SQL = N'SELECT @fluxOUT = BulkColumn FROM OPENROWSET(BULK N''' + @cheminDuFichier + ''', SINGLE_BLOB) AS TMP',
      @ParamDefinition = N'@fluxOUT VARBINARY(MAX) OUTPUT',
      @nomDeFichier = RIGHT(@cheminDuFichier, CHARINDEX('\', REVERSE(@cheminDuFichier)) - 1)
 
  -- Récupère le fichier sous la forme d'une valeur binaire
  DECLARE @fluxFichier VARBINARY(MAX)
 
  EXEC sp_executesql
      @SQL,
      @ParamDefinition,
      @fluxFichier OUTPUT
 
  -- Stocke le flux dans la table
  INSERT INTO dbo.TbIcone
  (
    nomIcone,
    icone
  )
  VALUES
  (
    @nomDeFichier,
    @fluxFichier
  )
END

Je souhaite stocker l’image suivante (C:\SQLServer2008Dark.jpg) :

1
2
3
4
5
6
7
8
---------------------------------
-- Nicolas SOUQUET - 26/06/2009 -
---------------------------------
EXEC dbo.PsStockeIcone 'C:\SQLServer2008Dark.jpg'
GO
 
SELECT IDIcone, nomIcone, icone
FROM dbo.TbIcone

Notons que cette procédure fonctionne dès SQL Server 2005.

ElSuket

Laisser un commentaire