Question

Comment insérer facilement un blob dans un varbinary(MAX) champ?

À titre d'exemple:

Ce que je veux insérer est: c: \ picture.png
la table est mytable
la colonne est mypictureblob
l'endroit est recid = 1

Était-ce utile?

La solution

Vous pouvez insérer un champ varbinary (max) à l'aide de T-SQL dans SQL Server Management Studio et en particulier à l'aide de la commande OPENROWSET.

Par exemple:

INSERT Production.ProductPhoto 
(
    ThumbnailPhoto, 
    ThumbnailPhotoFilePath, 
    LargePhoto, 
    LargePhotoFilePath
)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET 
    (BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto

Consultez la documentation suivante pour un bon exemple / procédure pas à pas

Utilisation de types de grande valeur

Notez que le chemin du fichier dans ce cas est relatif au serveur SQL ciblé et non à votre client exécutant cette commande.

Autres conseils

MSDN a un article Utilisation de types de grande valeur ,  qui essaie d’expliquer le fonctionnement des pièces d’importation, mais cela peut être un peu déroutant car il fait 2 choses en même temps.

Ici, je fournis une version simplifiée, divisée en 2 parties. Supposons le tableau simple suivant:

CREATE TABLE [Thumbnail](
   [Id]        [int] IDENTITY(1,1) NOT NULL,
   [Data]      [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED 
(
[Id] ASC
) ) ON [PRIMARY]

Si vous exécutez (dans SSMS):

SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X

cela montrera que le résultat ressemble à une table avec une colonne nommée BulkColumn . C’est pourquoi vous pouvez l’utiliser dans INSERT comme:

INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X

Le reste consiste simplement à l'insérer dans un insert avec plus de colonnes, que votre table puisse avoir ou non. Si vous nommez le résultat de ce select FOO , vous pouvez utiliser SELECT Foo.BulkColumn et comme après cela constantes pour les autres champs de votre table.

La partie qui peut devenir plus compliquée consiste à savoir comment exporter ces données dans un fichier afin que vous puissiez vérifier si elles sont toujours correctes. Si vous l’exécutez sur la ligne de commande:

bcp "select Data from B2B.dbo.Thumbnail where Id=1" 
queryout D:\T\TestImage1_out2.dds -T -L 1 

Il va commencer à se plaindre de 4 autres "paramètres". et donnera des valeurs par défaut trompeuses (ce qui entraînera un fichier modifié). Vous pouvez accepter le premier, définir le 2ème sur 0, puis insérer les 3ème et 4ème, ou pour être explicite:

  

Entrez le type de stockage de fichier du champ Data [varbinary (max)]:
     Entrez la longueur du préfixe du champ de données [8]: 0
     Entrez la longueur du champ Data [0]:
     Entrer le terminateur de champ [aucun]:

Ensuite, il vous sera demandé:

  

Voulez-vous enregistrer ces informations de format dans un fichier? [Y / n] y
     Nom de fichier de l'hôte [bcp.fmt]: C: \ Test \ bcp_2.fmt

La prochaine fois que vous devrez l'exécuter, ajoutez -f C: \ Test \ bcp_2.fmt et il cessera de gémir :-) Économise beaucoup de temps et de peine.

Il existe deux méthodes pour sélectionner un blob avec TSQL:

SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a

Ainsi que:

SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a

Notez le nom de la corrélation après la clause FROM, qui est obligatoire.

Vous pouvez ensuite insérer ceci dans INSERT en effectuant un INSERT SELECT.

Vous pouvez également utiliser la deuxième version pour effectuer une MISE À JOUR comme je l’ai décrit dans Comment mettre à jour un BLOB dans SQL SERVER à l'aide de TSQL .

Cependant, vous pouvez simplement lire un fichier depuis un disque sur une machine serveur SQL:

select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a

pour le voir dans l'application de gestion au format hexadécimal (Management Studio).

Ainsi, vous pouvez, par exemple, sauvegarder la base de données dans un fichier (localement sur le serveur), puis la télécharger ailleurs en utilisant l'instruction ci-dessus.

Avez-vous besoin de le faire à partir de mgmt studio? Voici comment nous procédons à partir de la ligne de commande:

& C; \ Program Files \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe " / S < Serveur > / D < Base de données > / T mytable / C mypictureblob / F "C: \ picture.png" / W " où RecId = " / I

Ok… ça m'a pris beaucoup trop de temps. L'outil de studio de gestion SQL n'est tout simplement pas à la hauteur de choses simples comme celle-ci (ce que j'ai déjà remarqué lorsque je cherchais où définir le délai d'expiration des requêtes, et ce, dans quatre emplacements différents).

J'ai téléchargé un autre package d'éditeur SQL (SQL Maestro dans mon cas). Et voici, il inclut un éditeur de tâches qui vous permet de consulter les tâches et de charger de nouvelles tâches dans ce champ.

merci pour l'entrée!

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