MS SQL 2008 - jak wrzucić do kolumny pliki?


(kamil_w) #1

Utworzyłem sobie tabelę w następujący sposób:

USE article_docs_db

GO

CREATE TABLE article_files (

 DocID INT NOT NULL IDENTITY,

 DocTitle NVARCHAR(50) NOT NULL,

 DocFilename NVARCHAR(400) NOT NULL,

 FileExtension NVARCHAR(8) NOT NULL,

 DocSummary NVARCHAR(MAX) NULL,

 DocContent VARBINARY(MAX) NULL,

 CONSTRAINT [PK_article_files_DocID] PRIMARY KEY CLUSTERED (DocID ASC)

)

GO

Jak zrobić, żeby plik, którego ścieżkę podaję w kolumnie DocFilename był automatycznie ładowany do kolumny DocContent? Próbuję w ten sposób uzyskać możliwość przeszukiwania zawartości tych plików.


(Tomek Matz) #2

Chcesz wykonać INSERT do kolumny DocContent na podstawie ścieżki wstawionej w DocFileName? Czyli procedura niejako przyjmuje jeden parametr, ale wypełnia dwie kolumny? (BTW nie wiem jak wyobrażasz sobie przeszukiwanie plików binarnych?)


(kamil_w) #3

Nie. Ja wpisuję ścieżkę do pliku, a procedura wrzuca ten plik do DocContent.

Się da. Full-text search umożliwia przeszukiwanie plików binarnych. Po odpaleniu takiego kodu:

SELECT document_type, version, manufacturer

FROM sys.fulltext_document_types

Uzyskasz listę 136 obsługiwanych typów plików. EDIT: Ewentualnie jak w sposób manualny wprowadzić te pliki do tej kolumny? EDIT2: OK. Poradziłem sobie tak, że wprowadzam pliki do kolumny ręcznie za pomocą polecenia:

USE article_docs_db;

GO

INSERT INTO article_files(DocTitle, DocFilename,FileExtension, DocContent)

 SELECT 

 'tytuł_dokumentu' AS DocTitle,

 'nazwa_pliku.txt' AS DocFilename,

 '.rozszerzenie' AS FileExtention,

 * FROM OPENROWSET(BULK N'C:\ścieżka_do_pliku\nazwa_pliku.rozszerzenie', SINGLE_BLOB) AS Document

GO

Działa, choć szkoda, że nie automatycznie.


(Tomek Matz) #4

W sumie to o to mi chodziło. Z tego co teraz widzę, to u Ciebie DocFileName to nazwa pliku, a nie jego ścieżka. Mógłbyś sobie przygotować taką procedurę, która pobiera parametr ścieżka do pliku, a następnie na podstawie tego parametru wypełnia kolumny DocFileName, DocFileExtension (trzeba się zastanowić, co zrobić, gdy plik nie ma rozszerzenia) i DocContent. Gorzej będzie z DocTitle i DocSummary. To musiałyby być zapewne dwa dodatkowe parametry procedury, ewentualnie jakiś tekst wyciągnięty z pliku za pomocą wspomnianego przez Ciebie Full-text search (np. przy użyciu wyrażeń regularnych, o ile Full-text search na takie pozwala).

Kajam się. Nie wiedziałem. Daj znać na ile wydajna jest ta technologia i na ile obciąża serwer. Nie oczekuję, że przeprowadzisz jakieś testy, sam link do gotowych (w miarę aktualnych) w zupełności mi wystarczy.