Wednesday, 5. may 2010 3 05 /05 /Mai /2010 19:53

SQL FileStream zum effektiven Speichern von BLOBs = Binary Large Objects ist im Microsoft SQL Server ab Version 2008 neu hinzugekommen. Es kombinierte die Vorteile der Ablage im SQL Server als VarBinary Daten mit der Möglichkeit der transaktionellen Verarbeitung und der Ablage im File-System mit der performanten Zugriffsmöglichkeit über Windows Streaming / API Zugriff.

 

Es gibt ein wirklich sehr gutes und umfangreiches Whitepaper „FILESTREAM Storage in SQL Server 2008“ im MSDN Bereich von Paul S. Randall, das alle Aspekte rund um FileStream beleuchtet. Was soll ich dem hinzufügen?

 

Ich habe nun auch mal etwas experimentiert und ein paar erste Erfahrungen gesammelt:

·         Mein erster Test war unter Windows XP mit MS SQL Server 2008 Express Edition ohne SP, der unter dem Account „NetworkServices“ lief. Die Anlage der Dateigruppe für FileStream schlug mit einer nicht gerade aussagekräftigen Fehlermeldung fehl wie
Unable to open the physical file "c:\Program Files\Microsoft SQL Server\...". Operating system error -2147024891: "0x80070005(Access is denied.)"
 Eine kurze Recherche ergab, dass der Dienst unter einem Windows Account laufen muss, damit es funktioniert. Einen entsprechenden Eintrag gibt es bereits bei MS Connect. Mit meiner Developer Edition unter Windows Vista mit Dienstkonto „Local System“ hingegen funktionierte es ohne Änderungen.

·         Änderungen an FileStream Daten, also UPDATE und DELETE, werden nicht direkt im Transaktionsprotokoll protokolliert, sondern in Form von revisionierten Dateien. Diese verbleiben im Dateisystem bis zur nächsten Voll- bzw. Log-Sicherung; das muss man bei der Planung des Speicherplatzes beachten.

 

USE [master]
GO
EXEC sp_configure filestream_access_level, 2;
GO
RECONFIGURE;
GO
 
ALTER database AdventureWorks
ADD FILEGROUP [FileStreamFG]
CONTAINS FILESTREAM
GO
 
ALTER database AdventureWorks
ADD FILE
(
    NAME= 'FileStream',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL10DEV\FG'
)
TO FILEGROUP [FileStreamFG]
GO
 
USE [AdventureWorks]
GO
 
CREATE TABLE dbo.FileStreamStorage
      (
      [Id] int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
      [Guid] uniqueidentifier NOT NULL UNIQUE ROWGUIDCOL DEFAULT NEWID(),
      [FileName] varchar(255) NOT NULL,
      [FileStreamData] varbinary(MAX) FILESTREAM NULL 
      )  ON [PRIMARY]
      FILESTREAM_ON [FileStreamFG]
GO
 
INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData])
VALUES ('Test1.txt', CONVERT(varbinary(max), N'Hello World'));
 
INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData])
VALUES ('Test2.txt', CONVERT(varbinary(max), N'Hello World again'));
 
INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData])
VALUES ('Test3.txt', CONVERT(varbinary(max), N'Hello World again'));
 
INSERT INTO dbo.FileStreamStorage ([FileName], [FileStreamData])
VALUES ('Test4.txt', CONVERT(varbinary(max), 'Hello World again'));
GO
 
DELETE FROM dbo.FileStreamStorage
WHERE [Id] <= 4;
von Olaf Helper - veröffentlicht in: T-SQL - Community: SQL Scripter
Kommentar hinzufügen - Kommentare (2)ansehen
Friday, 30. april 2010 5 30 /04 /Apr. /2010 21:25

Gute, weil vollständige und korrekte Referenzdaten, sind schwierig zu finden; in der Regel kann man sie nur bei kommerziellen Anbieter für einiges an Geld beziehen.

Referenzdaten, die dann auch noch regelmäßig aktualisiert werden und zu allem Überfluss auch noch frei verfügbar sind, sind eine Seltenheit.

Das Verzeichnis für deutsche Bankleitzahlen ist so eine Seltenheit. Sie wird von der Deutschen Bundesbank herausgegeben, ist auf deren Seite frei verfügbar und wird auch quartalsweise aktualisiert. Eine Dokumentation des Dateiformates gibt es auch.

Das Dateiformat ist einfach gehalten, es eine Textdatei und die Spalten haben jeweils eine fester Breite. In dem Fall ist die einfachste Möglichkeit, die Daten zu importieren, mit OpenRowSet und der Bulk Option zu arbeiten. Als ich mir die Dokumentation dazu durchgelesen habe, fiel mir auf, dass zwar ausführlich die Anwendung für zeichengetrennte Formate beschrieben ist inklusive Beispiele, aber in keiner Weise, wie man Daten mit fester Spaltenbreite handhabt. Also Mut zur Lücke, eine Formatdatei definiert ohne Trennzeichen und die Spaltenbreite angegeben; die maximal Breite muss man eh festlegen und siehe da, der Import per BULK funktioniert einwandfrei.

Kleines Problem ist, das der Dateiname „versioniert“ wird, also der Dateiname das Datum der Veröffentlichung beinhaltet. Zwar gibt es fest definierte Regeln, wann das neue Verzeichnis veröffentlicht wird, man kann das Datum errechnen, aber das erschwert den Automatismus, um die Datei per SSIS über FTP / http herunter zu laden, um sie dann weitere zu verarbeiten.

 

Hier nun der Aufbau der Format-Datei und das Statement für den Bulk – Import; die gesamte SSMS Solution gibt es auch zum Download, sie beinhaltet auch das Tabellen Design.

 

Format Datei BLZ_Format.txt:

 

8.0
13
1     SQLCHAR     0     8     ""    1     Blz   ""
2     SQLCHAR     0     1     ""    2     BlzFuehrend ""
3     SQLCHAR     0     58    ""    3     Bezeichnung ""
4     SQLCHAR     0     5     ""    4     Plz   ""
5     SQLCHAR     0     35    ""    5     Ort   ""
6     SQLCHAR     0     27    ""    6     Kurzbezeichnung   ""
7     SQLCHAR     0     5     ""    7     InstitutsnummerPAN      ""
8     SQLCHAR     0     11    ""    8     Bic   ""
9     SQLCHAR     0     2     ""    9     PruefzifferMethode      ""
10    SQLCHAR     0     6     ""    10    Nummer      ""
11    SQLCHAR     0     1     ""    11    Aenderung   ""
12    SQLCHAR     0     1     ""    12    Loeschung   ""
13    SQLCHAR     0     8     "\n"  13    NachfolgerBlz     ""

 

Das SQL Statement für den Import über OpenRowSet.

 

-- Daten einfügen
INSERT INTO [BLZ].[dbo].[Blz]
           ([Blz]
           ,[BlzFuehrend]
           ,[Bezeichnung]
           ,[Plz]
           ,[Ort]
           ,[Kurzbezeichnung]
           ,[InstitutsnummerPAN]
           ,[Bic]
           ,[PruefzifferMethode]
           ,[Nummer]
           ,[Aenderung]
           ,[Loeschung]
           ,[NachfolgerBlz])           
SELECT [Blz]
      ,CONVERT(tinyint, [BlzFuehrend]) AS BlzFuehrend
      ,RTRIM([Bezeichnung]) AS [Bezeichnung]
      ,[Plz]
      ,RTRIM([Ort]) AS [Ort]
      ,RTRIM([Kurzbezeichnung]) AS [Kurzbezeichnung]
      ,CONVERT(int, CASE WHEN [InstitutsnummerPAN] = ''
                         THEN NULL
                         ELSE [InstitutsnummerPAN]
                         END) AS [InstitutsnummerPAN]
      ,CASE WHEN [Bic] = '' 
                 THEN NULL
                 ELSE [Bic] END AS [Bic]
      ,[PruefzifferMethode]
      ,CONVERT(int, [Nummer]) AS [Nummer]
      ,[Aenderung]
      ,CONVERT(bit, [Loeschung]) AS [Loeschung]
      ,[NachfolgerBlz]
FROM OPENROWSET(BULK N'D:\Projekte\Blz\blz_20100308.txt'
               ,FORMATFILE = N'D:\Projekte\Blz\blz_format.txt'
               ,CODEPAGE = 'OEM' 
               ,ERRORFILE = N'D:\Projekte\Blz\blz_error.txt'
               ) AS Blz
GO
von Olaf Helper - veröffentlicht in: T-SQL - Community: SQL Scripter
Kommentar hinzufügen - Kommentare (0)ansehen
Thursday, 29. april 2010 4 29 /04 /Apr. /2010 18:56

Ich hätte ja noch etwas warten können ... nun gibt es die Microsoft Visual Studio 2010 Express Editions auch als deutsche Version im Download.

von Olaf Helper - veröffentlicht in: .NET - Community: Database Administrator - DBA
Kommentar hinzufügen - Kommentare (1)ansehen
Thursday, 29. april 2010 4 29 /04 /Apr. /2010 18:34

Im Microsoft Press Blog gibt es das eBook "Introducing Microsoft SQL Server 2008 R2" von den Autoren Ross Mistry und Stacia Misner als kostenlosen Download im XPS und PDF Format.

Entgegen der bisherigen freien eBooks muss man sich nicht per LiveID anmelden und die Verfügbarkeit ist nicht zeitlich beschränkt, zumindest habe ich in der Hinsicht nichts gesehen. 

von Olaf Helper - veröffentlicht in: Free eBooks - Community: Microsoft SQL Server
Kommentar hinzufügen - Kommentare (0)ansehen
Sunday, 25. april 2010 7 25 /04 /Apr. /2010 13:17

Microsoft Visual Studio 2010 ist bereits über eine Woche im RTM Status und MSDN Abonnenten können sie herunterladen, mittlerweile auch als deutsch-sprachige Version.

Die Express Edition VS 2010 mit C#, Visual Basic und Web Developer gibt es nun auch zum Download, bisher aber nur in englischer Sprache.

Ich konnte natürlich nicht abwarten, bis eine deutsch-sprachige Version verfügbar ist (wozu auch) und habe mir MS Visual Basic 2010 Express herunter geladen. Es ist wieder ein Web-Installer, der selbst 3,2 MB groß ist. Bei meiner Konfiguration wurden dann 150 MB nachgeladen, auf dem Installationsvolume werden insgesamt 2,3 GB freier Platz benötigt. Eine MS SQL Server Express Instanz kann optimional mit installiert werden; und wie die letzten Male ist es keine "gleiche Version", also kein 2008 R2, sondern 2008 mit SP1.

Auf meinem MS Vista 32-bit Rechner lief die Installation problemlos ab, allerdings war zwischendurch ein Reboot nötig.

von Olaf Helper - veröffentlicht in: .NET - Community: .NET Development
Kommentar hinzufügen - Kommentare (0)ansehen

Über diesen Blog

Kategorien

Kalender

February 2012
M T W T F S S
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        
<< < > >>

Syndication (RSS)

  • RSS-Feed der Artikel

Suchen

Blog erstellen

Erstellen Sie einen Blog auf OverBlog - Kontakt - Nutzungsbedingungen - Werbung - Missbrauch melden - Impressum - Artikel mit den meisten Kommentaren