Du willst eine Excel Tabelle importieren, welche Daten enthält, die in zwei verschiedenen SQL-Tabellen, die mit einem Fremdschlüssel verbunden sind, eingepflegt werden sollen? Dafür gibt es von SQL standardmäßig keine Möglichkeit, aber in diesem Tutorial zeigen wir dir einen Trick, dieses Problem zu lösen.
Lösung:
- Lege eine temporäre Datenbanktabelle an (in diesem Beispiel „TmpImport“)
- Importiere die Daten aus der Excel-Datei in deine temporäre Datenbanktabelle
- Führe folgendes Script aus:
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 30 31 32 33 34 35 36 37 38 |
DECLARE @ImportId int DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT i.ID -- select id from import table and loop through ids, using a cursor FROM ImportDatabaseName..TmpImport i WHERE NOT EXISTS (SELECT [Name] FROM ImportDatabaseName..[ImportTableName] p WHERE i.[Name] = p.[Name]) -- WHERE is just an example OPEN MY_CURSOR FETCH NEXT FROM MY_CURSOR INTO @ImportId WHILE @@FETCH_STATUS = 0 BEGIN -- declare a variable to hold the new inserted id declare @currentId int -- insert data to main table INSERT INTO ImportDatabaseName..[ImportTableName] (ColumnName1,ColumnName2,ColumnName3) SELECT i.Col1,i.Col2,i.Col3 FROM ImportDatabaseName..TmpImport i WHERE i.ID = @ImportId -- get identity id from inserted set SELECT @currentId = SCOPE_IDENTITY() PRINT @currentId -- insert into connected table, using currentId as foreign key INSERT INTO [ImportDatabaseName]..[SecondImportTableName] (ColumnName1,ColumnName2,ColumnName3,ForeignKeyColumn) SELECT i.Col4,i.Col5,i.Col6,@currentId FROM ImportDatabaseName..TmpImport i WHERE i.ID = @ImportId FETCH NEXT FROM MY_CURSOR INTO @ImportId END CLOSE MY_CURSOR DEALLOCATE MY_CURSOR DROP TABLE ImportDatabaseName..TmpImport |
Hinweise zum Skript:
- Funktioniert nur, wenn bei den beiden Datenbanktabellen die Identitätsspezifikation (autoincrement) der ID auf „Ja“ eingestellt wurde.
- Du musst in dem Script einige Namen anhand deiner eigenen Datenbank ändern. Die zu ändernden Namen sind:
- „ImportDatabaseName“ = Name deiner Datenbank
- „TmpImport“ = Name deiner temporärer Tabelle
- „ImportTableName“ = Name der Tabelle, die den Primärschlüssel besitzt
- „SecondImportTableName“ = Name der Tabelle, die den Fremdschlüssel besitzt
- „ColumnName1″,“ColumnName2″,“ColumnName3“ = Name der Spalten der „ImportTableName“
- „ColumnName1″,“ColumnName2″,“ColumnName3“ = Name der Spalten der „SecondImportTableName“
- „Col1“, „Col2“, „Col3“, „Col4“, „Col5“, „Col6“ = Spaltennamen der temporären Tabelle
- Die temporäre Tabelle wird am Ende des Skriptes gelöscht.
Wir hoffen wir konnten dir mit diesem kleinen Tutorial bei der Lösung deines Problems helfen.