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

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top