{"id":160,"date":"2010-04-11T16:05:41","date_gmt":"2010-04-11T15:05:41","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2010\/04\/temporaere-tabellen-in-ssis-verwenden\/"},"modified":"2010-04-11T16:05:41","modified_gmt":"2010-04-11T15:05:41","slug":"temporaere-tabellen-in-ssis-verwenden","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2010\/04\/temporaere-tabellen-in-ssis-verwenden\/","title":{"rendered":"tempor\u00e4re Tabellen in SSIS verwenden"},"content":{"rendered":"<p>F\u00fcr manche Aufgaben erscheint es sinnvoll, Daten zun\u00e4chst in tempor\u00e4re Tabellen zu \u00fcbertragen, um sie dann zum Beispiel per Insert oder Update in die Zieltabelle zu \u00fcberf\u00fchren (damit kann man ein &#8222;Bulk Update&#8220; durchf\u00fchren).<\/p>\n<p>Dazu kann man nat\u00fcrlich im SQL-Server beliebige Tabellen anlegen, die dann nur &#8222;logisch&#8220; tempor\u00e4r sind, da sie ja st\u00e4ndig in der Datenbank sind.<\/p>\n<p>Der SQL Server bietet aber auch tempor\u00e4re Tabellen an, die sessionweit (# &#8211; sobald die Connection geschlossen wird, verschwindet die Tabelle) oder global (## &#8211; sobald die letzte Connection geschlossen wird, die diese Tabelle verwendet, verschwindet sie) gelten.<\/p>\n<p>Diese in SSIS zu verwenden, mag z.B. Sinn machen, wenn man keine Tabellen-Erstellungs-Rechte auf dem Zielserver hat.<\/p>\n<p>Sie zu verwenden, ist nicht ganz einfach:<\/p>\n<p>Nehmen wir an, wir wollen eine tempor\u00e4re Tabelle mit einer einzigen numerischen Spalte anlegen, so geht das so:<\/p>\n<blockquote>\n<p>\nCREATE TABLE [dbo].[#ZielTabelle]<br \/>\n(<br \/>\n[zahl] [int] NOT NULL<br \/>\n)<\/p>\n<p><u>Randbemerkung:<br \/><\/u>Man kann auch Primary Keys vergeben, z.B. mit folgendem Statement:<\/p>\n<blockquote>\n<p>CREATE TABLE [dbo].[#ZielTabelle]<br \/>\n(<br \/>\n[zahl] [int] NOT NULL,<br \/>\nCONSTRAINT ZielTabelle_PK PRIMARY KEY CLUSTERED<br \/>\n(<br \/>\n[zahl] ASC<br \/>\n)<br \/>\n)<\/p>\n<\/blockquote>\n<p>Das w\u00e4re aber nicht so gut, da dann ein Vorteil verloren geht: Eine solche tempor\u00e4re Tabelle (#) kann mehrfach existieren (je Connection einmal). Verwendet man aber einen festen Primary-Key-Namen, so geht das nicht mehr. Man k\u00f6nnte in den Namen des Primary Key eine GUID einbauen und h\u00e4tte wieder Eindeutigkeit.<\/p>\n<\/blockquote>\n<p>Dieses Create-Table-Statement baut man in eine Execute-SQL-Task und kann dann folgenden Workflow abbilden:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Workflow\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/workflow.jpg\" width=\"179\" height=\"458\" \/><\/p>\n<p>Den DROP TABLE braucht man nicht unbedingt, da nach Schlie\u00dfen der Connection die Tabelle eh verschwindet. Aber aus Gr\u00fcnden der Hygiene empfehle ich es.<\/p>\n<p>Unser Datenflusstask soll im Beispiel einfach alle Zahlen von 1 bis 10 in die tempor\u00e4re Tabelle schreiben:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"DataFlow\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/dataflow.jpg\" width=\"262\" height=\"149\" \/><\/p>\n<p>Die Skript-Komponente hat folgenden Code:<\/p>\n<blockquote>\n<p>public override void CreateNewOutputRows()<br \/>\n{<br \/>\nfor (int i = 1; i &lt;= 10; i++)<br \/>\n{<br \/>\nAusgabeBuffer.AddRow();<br \/>\nAusgabeBuffer.Zahl = i;<br \/>\n}<br \/>\n}<\/p>\n<\/blockquote>\n<p>Nun haben wir aber ein Problem: Die temp-Tabelle taucht nicht in der Liste der Tabellen auf. Deswegen empfiehlt es sich, auf dem Entwicklungsrechner eine Tabelle mit der selben Struktur anzulegen, und diese dann auszuw\u00e4hlen (hier &#8222;ZielTab_gibtsNetProduktiv&#8220;):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Ziel\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/ziel.jpg\" width=\"447\" height=\"500\" \/><\/p>\n<p>Nun kann man auf dem n\u00e4chsten Reiter die Zuordnungen &#8211; wie gewohnt &#8211; einstellen (was in diesem Beispiel sehr einfach ist \ud83d\ude42 ):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Zuordnungen\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/zuordnungen.jpg\" width=\"319\" height=\"232\" \/><\/p>\n<p>Noch haben wir aber nichts gewonnen, da die tempor\u00e4re Tabelle nicht verwendet wird.<\/p>\n<p>Es m\u00fcssen deshalb noch ein paar Einstellungen vorgenommen werden:<\/p>\n<ul dir=\"ltr\">\n<li>\n<div>Unter Eigenschaften des OLEDB-Ziels muss man in OpenRowset die tempor\u00e4re Tabelle eintragen:<br \/>\n<u>Vorher:<br \/><\/u><img loading=\"lazy\" decoding=\"async\" alt=\"nachher\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/vorher.jpg\" width=\"423\" height=\"216\" \/><br \/>\n<u>Nachher:<\/u><br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"nachher\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/nachher.jpg\" width=\"424\" height=\"249\" \/><\/div>\n<\/li>\n<li>\n<div>Die weitere Eigenschaft &#8222;ValidateExternalMetaData&#8220; des OLEDB-Ziels muss auf &#8222;false&#8220; gestellt, da zum Zeitpunkt der Entwicklung bzw. des Starten des Pakets die tempor\u00e4re Tabelle noch nicht existiert.<\/div>\n<\/li>\n<\/ul>\n<p>Jetzt funktioniert das Paket immernoch nicht. Es tritt folgender Fehler auf:<\/p>\n<blockquote>\n<p>[Speichern in temp Tabelle [16]] Fehler: Fehler beim \u00d6ffnen eines FastLoad-Rowsets f\u00fcr &#8218;#ZielTabelle&#8216;. \u00dcberpr\u00fcfen Sie, ob das Objekt in der Datenbank vorhanden ist.<\/p>\n<\/blockquote>\n<p>Offensichtlich kennt der DataFlow Task die Tabelle nicht. Dies liegt daran, dass der CREATE TABLE-Befehl und der Datenfluss-Task nicht in der selben Connection ausgef\u00fchrt werden. Deswegen m\u00fcssen wir noch die Eigenschaft der Connection &#8222;RetainSameConnection&#8220; auf true setzen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"RetainSameConnection\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/retainsameconnection.jpg\" width=\"260\" height=\"178\" \/><\/p>\n<p>Jetzt funktioniert es.<\/p>\n<p><u>Eine Anmerkung:<br \/><\/u>Man kann die Zuordnungen des OLEDB-Ziels nicht mehr mit dem normalen Editor bearbeiten, da zum Design-Zeitpunkt die tempor\u00e4re Tabelle nicht existiert. Man kann das durch das oben gezeigte Umstellen auf eine nur auf dem Entwicklungsserver existierende Tabelle umgehen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr manche Aufgaben erscheint es sinnvoll, Daten zun\u00e4chst in tempor\u00e4re Tabellen zu \u00fcbertragen, um sie dann zum Beispiel per Insert oder Update in die Zieltabelle zu \u00fcberf\u00fchren (damit kann man ein &#8222;Bulk Update&#8220; durchf\u00fchren). Dazu kann man nat\u00fcrlich im SQL-Server beliebige Tabellen anlegen, die dann nur &#8222;logisch&#8220; tempor\u00e4r sind, da sie ja st\u00e4ndig in der &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2010\/04\/temporaere-tabellen-in-ssis-verwenden\/\" class=\"more-link\"><span class=\"screen-reader-text\">tempor\u00e4re Tabellen in SSIS verwenden<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-160","post","type-post","status-publish","format-standard","hentry","category-integrationservices"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=160"}],"version-history":[{"count":0,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/160\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}