web-dev-qa-db-fra.com

Comment puis-je insérer des données de fichier binaire dans un champ SQL binaire à l'aide d'une simple instruction d'insertion?

J'ai un SQL Server 2000 avec une table contenant une colonne image.

Comment insérer les données binaires d'un fichier dans cette colonne en spécifiant le chemin du fichier?

CREATE TABLE Files
(
  FileId int,
  FileData image
)
58
scottm

Si vous entendez utiliser un littéral, il vous suffit de créer une chaîne binaire:

insert into Files (FileId, FileData) values (1, 0x010203040506)

Et vous aurez un enregistrement avec une valeur de six octets pour le champ FileData.


Vous indiquez dans les commentaires que vous souhaitez simplement spécifier le nom de fichier, ce que vous ne pouvez pas faire avec SQL Server 2000 (ou toute autre version que je connaisse).

Vous auriez besoin d'une procédure stockée CLR pour ce faire dans SQL Server 2005/2008 ou d'une procédure stockée étendue (mais j'éviterais cela à tout prix sauf si vous le devez) qui prend le nom de fichier puis insère les données (ou retourne l'octet) , mais cela peut être assez long).


En ce qui concerne la question de pouvoir uniquement obtenir des données à partir d'un SP/requête, je dirais que la réponse est oui, car si vous donnez à SQL Server la possibilité de lire des fichiers à partir du système de fichiers, que faites-vous lorsque vous n'êtes pas t connecté via l'authentification Windows, quel utilisateur est utilisé pour déterminer les droits? Si vous exécutez le service en tant qu'administrateur (à Dieu ne plaise), vous pouvez avoir une élévation de droits qui ne devrait pas être autorisée.

51
casperOne

Je crois que ce serait quelque part près.

INSERT INTO Files
(FileId, FileData)
SELECT 1, * FROM OPENROWSET(BULK N'C:\Image.jpg', SINGLE_BLOB) rs

Quelque chose à noter, ce qui précède s'exécute dans SQL Server 2005 et SQL Server 2008 avec le type de données comme varbinary(max). Il n'a pas été testé avec l'image comme type de données.

95
Blithe