Come inserire un BLOB in un database usando sql server management studio
-
10-07-2019 - |
Domanda
Come posso inserire facilmente un BLOB in un campo varbinary(MAX)
?
Ad esempio:
la cosa che voglio inserire è: c: \ picture.png
il tavolo è mistico
la colonna è mypictureblob
il posto è recid = 1
Soluzione
È possibile inserire in un campo varbinary (max) utilizzando T-SQL in SQL Server Management Studio e in particolare utilizzando il comando OPENROWSET.
Ad esempio:
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
Dai un'occhiata alla seguente documentazione per un buon esempio / procedura dettagliata
Utilizzo di tipi di valore elevati
Si noti che il percorso del file in questo caso è relativo al server SQL di destinazione e non al client che esegue questo comando.
Altri suggerimenti
MSDN ha un articolo Utilizzo di tipi di valore di grandi dimensioni , che cerca di spiegare come funzionano le parti di importazione, ma può creare un po 'di confusione poiché fa 2 cose contemporaneamente.
Qui sto fornendo una versione semplificata, suddivisa in 2 parti. Supponiamo la seguente tabella semplice:
CREATE TABLE [Thumbnail](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Data] [varbinary](max) NULL
CONSTRAINT [PK_Thumbnail] PRIMARY KEY CLUSTERED
(
[Id] ASC
) ) ON [PRIMARY]
Se esegui (in SSMS):
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
mostrerà che il risultato sembra una tabella con una colonna chiamata BulkColumn
. Ecco perché puoi usarlo in INSERT come:
INSERT [Thumbnail] ( Data )
SELECT * FROM OPENROWSET (BULK 'C:\Test\TestPic1.jpg', SINGLE_BLOB) AS X
Il resto lo sta semplicemente inserendo in un inserto con più colonne, che la tua tabella potrebbe avere o meno. Se assegni il risultato a tale select FOO
, puoi utilizzare SELECT Foo.BulkColumn
e as
dopo tali costanti per altri campi nella tabella.
La parte che può diventare più complicata è come esportare nuovamente quei dati in un file in modo da poter verificare che sia ancora OK. Se lo esegui su cmd line:
bcp "select Data from B2B.dbo.Thumbnail where Id=1"
queryout D:\T\TestImage1_out2.dds -T -L 1
Inizierà a piagnucolare per 4 " params " e fornirà valori predefiniti fuorvianti (che risulteranno in un file modificato). Puoi accettare il primo, impostare il 2 ° su 0 e quindi supporre 3 ° e 4 °, o essere esplicito:
Immettere il tipo di archiviazione file del campo Dati [varbinary (max)]:
Immettere la lunghezza prefisso del campo Dati [8]: 0
Immettere la lunghezza del campo Dati [0]:
Immettere il terminatore di campo [nessuno]:
Quindi chiederà:
Vuoi salvare queste informazioni sul formato in un file? [Y / n] y
Nome file host [bcp.fmt]: C: \ Test \ bcp_2.fmt
La prossima volta che devi eseguirlo aggiungi -f C:\Test\bcp_2.fmt
e smetterà di piagnucolare :-)
Risparmia molto tempo e dolore.
Esistono due modi per SELEZIONARE un BLOB con TSQL:
SELECT * FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
Oltre a:
SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Test\Test1.pdf', SINGLE_BLOB) a
Nota il nome di correlazione dopo la clausola FROM, che è obbligatorio.
Puoi quindi inserire INSERT facendo INSERT SELECT.
Puoi anche usare la seconda versione per fare un AGGIORNAMENTO come ho descritto in Come aggiornare un BLOB nel SERVER SQL usando TSQL .
Tuttavia puoi semplicemente leggere un file dal disco sul computer del server SQL:
select * from openrowset (bulk 'c:\path\filename.ext',single_blob) a
per vederlo nell'applicazione di gestione in formato esadecimale (Management Studio).
Quindi, ad esempio, è possibile eseguire il backup del database in un file (localmente sul server) e quindi scaricarlo in un altro posto con la precedente dichiarazione.
Devi farlo da mgmt studio? Ecco come lo facciamo da cmd line:
" C: \ Programmi \ Microsoft SQL Server \ MSSQL \ Binn \ TEXTCOPY.exe " / S & Lt; Server gt &; / D & Lt; DataBase gt &; / T mytable / C mypictureblob / F & Quot; C: \ picture.png & Quot; / W & Quot; dove RecId = & Quot; / I
Ok ... mi ci è voluto troppo tempo. Lo strumento sql-management studio non è all'altezza di cose semplici come questa (che ho notato prima quando cercavo dove impostare il timeout per le query, ed è stato fatto in 4 posizioni diverse)
Ho scaricato altri pacchetti di editor sql (sql maestro nel mio caso). Ed ecco che include un editor BLOB in cui è possibile guardare BLOB e caricare nuovi BLOB in questi campi.
grazie per l'input!