SSIS: Bedingungen für Spalten in Abhängigkeit verknüpfter Tabellen
avatar

Das Problem

Im Rahmen eines Datenimports hatte ich die Anforderung die Typ-Spalte in einer Tabelle für Hauptstellen zu befüllen.
Die Anforderung besagte, dass der die Typ-Spalte meines Hauptstellen-Datensatzes entweder beibehalten wurde (“Typ A”) oder den Typ der Zweigstelle (“Typ B”) beinhalten sollte, je nachdem ob die Hauptstelle Zweigstellen enthält die von Typ “B” sind oder nicht.

Die Lösung

Nach kurzem Nachdenken bin ich dann zu folgender Lösung gekommen, die ich nachfolgend kurz vorstellen möchte.
Zunächst sind die vier Tabellen für die Haupt- und Zweigstellen (zwei Warehouse und zwei Fachanwendungstabellen) nach folgenden Schemas zu erstellen:

  1. CREATE TABLE [dbo].[Warehouse_Hauptstellen](
  2. [Id] [int] NOT NULL,
  3. [Bezeichnung] [nvarchar](50) NOT NULL,
  4. [Typ] [nvarchar](50) NULL,
  5. PRIMARY KEY CLUSTERED
  6. (
  7. [Id] ASC
  8. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  9. ) ON [PRIMARY]
  10. GO
  11. CREATE TABLE [dbo].[Warehouse_Zweigstellen](
  12. [Id] [int] NOT NULL,
  13. [Bezeichnung] [nvarchar](50) NOT NULL,
  14. [Typ] [nvarchar](50) NOT NULL,
  15. [HauptstelleId] [int] NOT NULL,
  16. PRIMARY KEY CLUSTERED
  17. (
  18. [Id] ASC
  19. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  20. ) ON [PRIMARY]
  21. GO
  22. ALTER TABLE [dbo].[Warehouse_Zweigstellen] WITH CHECK ADD CONSTRAINT [FK_Warehouse_Zweigstellen_Warehouse_Hauptstellen] FOREIGN KEY([HauptstelIed])
  23. REFERENCES [dbo].[Warehouse_Hauptstellen] ([Id])
  24. GO
  25. ALTER TABLE [dbo].[Warehouse_Zweigstellen] CHECK CONSTRAINT [FK_Warehouse_Zweigstellen_Warehouse_Hauptstellen]
  26. GO
  27. CREATE TABLE [dbo].[Hauptstellen](
  28. [Id] [int] IDENTITY(1,1) NOT NULL,
  29. [Bezeichnung] [nvarchar](50) NOT NULL,
  30. [Typ] [nvarchar](50) NOT NULL,
  31. PRIMARY KEY CLUSTERED
  32. (
  33. [Id] ASC
  34. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  35. ) ON [PRIMARY]
  36. GO
  37. CREATE TABLE [dbo].[Zweigstellen](
  38. [Id] [int] IDENTITY(1,1) NOT NULL,
  39. [Bezeichnung] [nvarchar](50) NOT NULL,
  40. [HauptstelleId] [int] NOT NULL,
  41. [Typ] [nvarchar](50) NOT NULL,
  42. PRIMARY KEY CLUSTERED
  43. (
  44. [Id] ASC
  45. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  46. ) ON [PRIMARY]
  47. GO
  48. ALTER TABLE [dbo].[Zweigstellen] WITH NOCHECK ADD CONSTRAINT [FK_Zweigstellen_Hauptstellen] FOREIGN KEY([HauptstelleId])
  49. REFERENCES [dbo].[Hauptstellen] ([Id])
  50. GO
  51. ALTER TABLE [dbo].[Zweigstellen] CHECK CONSTRAINT [FK_Zweigstellen_Hauptstellen]
  52. GO

Es werden folgende Testdaten eingetragen:

  1. INSERT [dbo].[Warehouse_Hauptstellen] ([Id], [Bezeichnung], [Typ]) VALUES (1, N‚HQ Hamburg‘, N‚Typ A‘)
  2. INSERT [dbo].[Warehouse_Hauptstellen] ([Id], [Bezeichnung], [Typ]) VALUES (2, N‚HQ Bochum‘, N‚Typ A‘)
  3. INSERT [dbo].[Warehouse_Hauptstellen] ([Id], [Bezeichnung], [Typ]) VALUES (3, N‚HQ Duisburg‘, N‚Typ A‘)
  4. INSERT [dbo].[Warehouse_Zweigstellen] ([Id], [Bezeichnung], [Typ], [HauptstelleId]) VALUES (1, N‚Klein Hamburg1‘, N‚Typ A‘, 1)
  5. INSERT [dbo].[Warehouse_Zweigstellen] ([Id], [Bezeichnung], [Typ], [HauptstelleId]) VALUES (2, N‚Klein Hamburg2‘, N‚Typ B‘, 1)
  6. INSERT [dbo].[Warehouse_Zweigstellen] ([Id], [Bezeichnung], [Typ], [HauptstelleId]) VALUES (3, N‚Klein Bochum1‘, N‚Typ A‘, 2)
  7. INSERT [dbo].[Warehouse_Zweigstellen] ([Id], [Bezeichnung], [Typ], [HauptstelleId]) VALUES (4, N‚Klein Bochum2 ‚, N‚Typ A‘, 2)
  8. INSERT [dbo].[Warehouse_Zweigstellen] ([Id], [Bezeichnung], [Typ], [HauptstelleId]) VALUES (5, N‚Klein Duisburg1‘, N‚Typ B‘, 3)

Anschließend wird ein SSIS-Paket mit folgendem Inhalt angelegt:

image

In der OLE-DB-Quellen “Warehouse-Hauptstellen” wird einfach nur die Tabelle “Warehouse_Hauptstelle” geholt.
Die OLE-DB-Quelle “Typen aus Zweigstellen holen” enthält folgendes SQL-Statement:

  1. SELECT HauptstelleId, Typ
  2. FROM Warehouse_Zweigstellen
  3. WHERE Typ = ‚Typ B‘

Damit sollen nur Zweigstellen geholt werden, die vom “Typ B” sind.
Der nachfolgende Join sieht folgendermaßen aus:

image

Anschließend folgt eine abgeleitete Spalte namens Typ, die die eigentliche Bedingung enthält:
image

Mithilfe der Expression:

  1. ISNULL(Typ_Zweigstelle) ? Typ_Hauptstelle : Typ_Zweigstelle

wird die nun geprüft, ob die Hauptstelle Zweigstellen hat, die vom Typ “Typ B” sind (Feld “Typ_Zweigstelle”).
In dem Fall, wir dieser Typ verwendet, ansonsten der Typ aus der Hauptstelle.
Die Überprüfung erfolgt durch einen sog. ternären Operator nach dem Schema:

  1. <Bedingung> ? Wenn Bedingung=true : Bedingung=false

Das Ergebnis des Import sieht dann folgendermaßen aus:

image

Hier sieht man deutlich, dass die Hauptstellen Hamburg und Duisburg (rot und grün) den Typ B bekommen haben, die sie mindestens eine Zweigstelle des Typs B besitzen. Die Zweigstelle Bochum behält den Typ A bei, da sie keine Zweigstelle vom Typ B enthält.

Fazit

In meinem Fall hat das Importieren gut geklappt. Das Thema war es meiner Meinung nach Wert, geteilt zu werden, da man immer mal wieder auf solche oder ähnliche Anforderungen stößt und doch eine Weile überlegen muss, wie sie umzusetzen ist.

Links

[1] http://www.josefrichberg.com/journal/2009/8/24/if-then-else-statement-in-ssis-derived-columns.html

Schreibe einen Kommentar