web-dev-qa-db-fra.com

Comment insérer un blob dans une base de données à l'aide de SQL Server Management Studio

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

Par exemple:

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

48
Toad

Vous pouvez insérer dans un champ varbinary (max) en utilisant T-SQL dans SQL Server Management Studio et en particulier en utilisant 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

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

Travailler avec des types de grande valeur

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

64
John Sansom

MSDN a un article Travailler avec des types de grande valeur , qui essaie d'expliquer comment fonctionnent les pièces d'importation, mais il peut être un peu déroutant car il fait 2 choses simultanément.

Ici, je propose 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

il montrera que le résultat ressemble à un tableau 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 peut ou non avoir. Si vous nommez le résultat de cette select FOO alors vous pouvez utiliser SELECT Foo.BulkColumn et as après ces constantes pour les autres champs de votre table.

La partie qui peut devenir plus délicate est de savoir comment exporter ces données dans un fichier afin que vous puissiez vérifier qu'elles sont toujours correctes. Si vous l'exécutez sur la ligne cmd:

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

Cela va commencer à pleurnicher pour 4 "paramètres" supplémentaires et donnera des valeurs par défaut trompeuses (ce qui entraînera un fichier modifié). Vous pouvez accepter le premier, mettre le 2e à 0 puis assept le 3e et le 4e, ou pour être explicite:

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

Ensuite, il demandera:

Voulez-vous enregistrer ces informations de format dans un fichier? [O/n] y
Nom du fichier 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 pleurnicher :-) Économise beaucoup de temps et de chagrin.

15
ZXX

Il existe deux façons de sélectionner un BLOB avec TSQL:

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

Aussi bien que:

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

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

Vous pouvez ensuite l'insérer en faisant 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 en utilisant TSQL .

8
yoel halb

Cependant, vous pouvez simplement lire un fichier à partir du disque sur une machine SQL Server:

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

pour le voir dans l'application de gestion sous forme hexadécimale (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 à un autre endroit par l'instruction ci-dessus.

2
pbies

Devez-vous le faire depuis mgmt studio? Voici comment nous le faisons à partir de la ligne cmd:

"C:\Program Files\Microsoft SQL Server\MSSQL\Binn\TEXTCOPY.exe"/S <Server>/D <DataBase>/T mytable/C mypictureblob/F "C:\picture.png"/W "where RecId = "/ I

1
cagreen

Ok ... ça m'a pris trop de temps. L'outil sql-management studio n'est tout simplement pas à la hauteur de choses simples comme celle-ci (que j'ai remarqué auparavant lorsque je cherchais où définir le délai d'expiration des requêtes, et cela a été fait à 4 endroits différents)

J'ai téléchargé un autre package de l'éditeur sql (sql maestro dans mon cas). Et voici, il comprend un éditeur de blobs dans lequel vous pouvez consulter les blobs et charger de nouveaux blobs dans ces champs.

merci pour l'entrée!

0
Toad