2009-07-13 12 views
47

Mam program SQL Server 2000 z tabelą zawierającą kolumnę image.Jak mogę wstawić dane binarne do binarnego pola SQL za pomocą prostej instrukcji wstawiania?

Jak wstawić dane binarne pliku do tej kolumny, określając ścieżkę pliku?

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

binarny (max) w MS SQL 2000? Jak pamiętam, w tej wersji zmienna binarna może mieć tylko stałą długość i może zawierać do 8000 bajtów. W moich własnych projektach zapisaliśmy pliki w polach IMAGE. –

+0

@Alex_L, właśnie sprawdził schemat, to jest obraz. – scottm

Odpowiedz

41

Jeśli masz na myśli używając dosłowny, po prostu trzeba utworzyć ciąg binarny:

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

a będziesz miał zapis o wartości sześciu bajtów dla pola FileData.


wskazać w komentarzach, że chcesz po prostu podać nazwę pliku, którego nie można zrobić z SQL Server 2000 (lub dowolnej innej wersji, że jestem świadomy).

Potrzebowałbyś procedury składowanej CLR, aby zrobić to w SQL Server 2005/2008 lub rozszerzonej procedurze przechowywanej (ale unikałbym tego za wszelką cenę, chyba że musisz), która pobiera nazwę pliku, a następnie wstawia dane (lub zwraca ciąg bajtów, ale może to być dość długie).


W odniesieniu do kwestii tylko jest w stanie uzyskać dane z SP/zapytania, powiedziałbym, że odpowiedź brzmi tak, ponieważ jeśli dać możliwość odczytu plików z systemu plików SQL Server, co czy robisz, gdy nie jesteś połączony poprzez uwierzytelnianie systemu Windows, jakiego użytkownika używa się do określenia praw? Jeśli korzystasz z usługi jako administrator (nie daj Boże), możesz uzyskać wyższy poziom uprawnień, które nie powinny być dozwolone.

+1

Chcę tylko podać nazwę pliku. – scottm

+0

Tak więc, pola obrazu/binarne były przeznaczone tylko dla aplikacji, które mogą czytać dane binarne przechodzące przez zapytanie/sp? – scottm

+0

Myślę, że poniższe rozwiązanie jest preferowane, ponieważ zawiera krok do konwersji z pliku ścieżki. Przetestowałem to z obrazem typu danych i zadziałało. –

79

Wierzę, że to będzie gdzieś blisko.

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

Coś pamiętać, że powyższe działa w SQL Server 2005 i SQL Server 2008 z typem danych jako varbinary(max). Nie został przetestowany z obrazem jako typem danych.

+17

Uwaga: to musiało być oczywiste dla wszystkich (oprócz mnie), ale ścieżka pliku prawdopodobnie musi istnieć na rzeczywistym hoście bazy danych. Jeśli plik jest przechowywany na komputerze zdalnym, napotkany zostanie następujący błąd: Nie można załadować zbiorczo, ponieważ nie można otworzyć pliku "..". – timmi4sa

+1

+1 Nie tylko "gdzieś blisko" - działa tutaj idealnie (SQL Server 2005). –

+0

Wow. Stonking tip! W naszej firmie nasze wewnętrzne centrum danych znajduje się na odległym kontynencie i mamy duże problemy z opóźnieniami. Pobranie C# do zapisania pliku 7Mb do rekordu SQL Server zajmuje 30 sekund. Ale skopiowanie pliku na maszynę SQL Server, a następnie użycie tego INSERT do zapisania go w rekordzie trwa w sumie około 3 sekund. Genialna wskazówka, szczególnie, że nie polega na OLEDB (co zawsze powoduje problemy z serwerem SQL) –

Powiązane problemy