Datenbanken und mehr

11. April 2007

Wie lade ich Dokumente in die DB?

Filed under: T-SQL — Urs Gehrig @ 12:47

Warum Dokumente überhaupt in die DB sollen, darüber habe ich bereits in einem meiner letzten Bloggs geschrieben. Heute geht es darum, wie die Dokumente dort hineinkommen. Aber zuerst ein paar Worte über die Wahl des richtigen Datentyps.

Bis und mit SQL Server 2000 mussten wir unsere Dokumente als text, ntext oder image in der DB ablegen. Der Zugriff auf diese Informationen war aufwendig und kompliziert; mit Hilfe eines TEXTPTR mussten wir blockweise durch das ganze Dokument iterieren. Mit dem Erscheinen von SQL Server 2005 sind diese Datentypen für künftige SQL Server Version nun abgekündigt worden; an ihre Stelle treten varchar(max), nvarchar(max) und varbinary(max). Die maximale Grösse der Dokumente die darin Platz finden ist unverändert bei 2GB geblieben.

Der grosse Vorteil dieser neuen Datentypen liegt im wesentlich einfacheren Handling. Mit Informationen vom Typ nvarchar(max) kannst du genau gleich umgehen wie mit dem altbekannten Typ nvarchar. Auch alle Stringfunktionen lassen sich neu auf Variablen und Spalten vom Typ nvarchar(max) anwenden.

Folgedessen heisst mein Favorit für das Speichern von Dokumenten in der DB nvarchar(max).

Und wie kommt unser Dokument nun in die DB? Am einfachsten kann ich das anhand eines Beispiels erklären:

CREATE TABLE myTable
(
    FileName nvarchar(250),
    FileType nvarchar(10),
    Document nvarchar(max)
)

GO

INSERT INTO myTable(FileName, FileType, Document)
SELECT ‚Offerte1.txt‘ AS FileName,
       ‚.txt‘ AS FileType,
       * FROM OPENROWSET(BULK N’C:\Offerte1.txt‘, SINGLE_NCLOB) AS Document

Wenn die Dokumente erst mal in der DB sind, kannst du in gewohnter Weise darauf zugreifen:

SELECT UPPER(Document) FROM myTable

Kleine Anmerkung: Im OPENROWSET bewirkt SINGLE_NCLOB, dass das Dokument als UNICODE Formatiert angeschaut wird. Der passende Datentyp für das Ziel dieses Dokumentes ist demnach nvarchar(max). Analog hierzu gibt es auch noch SINGLE_CLOB für varchar(max) und SINGLE_BLOB für varbinary(max).

So, das war’s. Ist doch gar nicht so schwer – vorausgesetzt du kannst deine Applikation ausschliesslich für den SQL Server 2005 und seine Nachfolger schreiben. Viel Spass!

Advertisements

1 Kommentar »

  1. Hallo Urs,

    ich bin ein großer Fan des OpenRowSet und nutze es bei jeder Gelegenheit. Deswegen freue ich mich, dass Du es vorstellst.
    Ein Hinweis ist allerdings noch interessant: Am SQL-Server-2000 musste man meiner Erinnerung nach Admin sein, um das nutzen zu können. Am SQL-Server-2005 darf es zwar immer noch nicht jeder Nutzer nutzen, aber man muss nur das Recht auf „ADMINISTER BULK OPERATIONS“ haben.

    Das sollte allerdings keine Hürde sein. Eine Hürde hingegen war für mich öfters schon, dass die Dateien am Server liegen müssen (OK, es gibt eine Ausnahme, aber die ist bei uns nicht anwendbar). Und wenn man die Dateien über eine Freigabe an den Server kopiert, dann muss man den Pfad natürlich aus Sicht des Servers angeben. Also nicht „\\MyServ\Share\dir\file.txt“, sondern „F:\Sharedir\dir\file.txt“. Aber wenn es der eigene Server ist, dann weiß man die Pfade vermutlich eh auswendig…

    Viele Grüßlinge

    Thomas

    Kommentar von Thomas — 11. April 2007 @ 21:00


RSS feed for comments on this post. TrackBack URI

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Bloggen auf WordPress.com.

%d Bloggern gefällt das: