2009-07-13 13 views
47

Ho un SQL Server 2000 con una tabella contenente una colonna image.Come posso inserire dati di file binari in un campo SQL binario usando una semplice istruzione di inserimento?

Come inserire i dati binari di un file in quella colonna specificando il percorso del file?

CREATE TABLE Files 
(
    FileId int, 
    FileData image 
) 
+0

binario (max) in MS SQL 2000? Come ricordo in questa versione, la variabile binaria può avere una lunghezza fissa e può contenere fino a 8000 byte. Nei miei progetti abbiamo archiviato i file nei campi IMMAGINE. –

+0

@Alex_L, appena ricontrollato lo schema, è immagine. – scottm

risposta

41

Se si intende utilizzare un letterale, è sufficiente per creare una stringa binaria:

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

E si avrà un record con un valore di sei byte per il campo FileData.


di indicare nei commenti che si desidera specificare solo il nome del file, che non si può fare con SQL Server 2000 (o qualsiasi altra versione di essere a conoscenza di).

Avresti bisogno di una procedura memorizzata CLR per eseguire questa operazione in SQL Server 2005/2008 o di una stored procedure estesa (ma eviterei che a tutti i costi a meno che non sia necessario) che prende il nome file e quindi inserisce i dati (o restituisce la stringa di byte, ma potrebbe essere piuttosto lunga).


Per quanto riguarda la questione di un solo essere in grado di ottenere i dati da un SP/domanda, direi che la risposta è sì, perché se si dà la possibilità di leggere i file dal file system di SQL Server, che cosa cosa fai quando non sei connesso tramite l'autenticazione di Windows, quale utente viene utilizzato per determinare i diritti? Se stai eseguendo il servizio come amministratore (Dio non voglia), allora puoi avere un aumento dei diritti che non dovrebbe essere consentito.

+1

Voglio solo specificare il nome del file. – scottm

+0

Quindi, i campi immagine/binario erano destinati solo a essere utilizzati con applicazioni in grado di leggere il pass di dati binari che tramite una query/sp? – scottm

+0

Penso che la soluzione seguente sia preferibile perché include un passaggio per la conversione da un percorso file. Testato con l'immagine del tipo di dati e ha funzionato. –

79

Credo che questo sarebbe da qualche parte vicino.

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

Qualcosa da notare, le piste di cui sopra in SQL Server 2005 e SQL Server 2008 con il tipo di dati come varbinary(max). Non è stato testato con l'immagine come tipo di dati.

+17

Nota: questo deve essere ovvio per tutti (tranne me), ma il percorso del file apparentemente deve esistere sull'host del database effettivo. Se il file è memorizzato sulla macchina remota, si verificherà il seguente errore: Impossibile caricare in blocco perché il file ".." non può essere aperto. – timmi4sa

+1

+1 Non solo "da qualche parte vicino" - funziona perfettamente qui (SQL Server 2005). –

+0

Wow. Punta stonking! Nella nostra azienda, il nostro centro dati interno è lontano da un continente e abbiamo grandi problemi di latenza. Ottenere C# per scrivere un file 7Mb in un record di SQL Server richiede 30 secondi. Ma copiare il file sul computer SQL Server, quindi utilizzare questo INSERT per scriverlo in un record richiede un totale di circa 3 secondi. Suggerimento brillante, in particolare perché non si basa su OLEDB (che sembra sempre causare problemi con SQL Server) –

Problemi correlati