Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Referenzdaten Bankleitzahlen

30. April 2010 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

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 

Diesen Post teilen

Repost 0

Kommentiere diesen Post