-- Wechsel zur Datenbank 'engomo' USE engomo; -- Deklariere eine Variable für das Tabellenpräfix DECLARE @TablePrefix NVARCHAR(128) = 'begehung_'; -- Deklariere eine Tabellenvariable mit den Endungen der Tabellennamen DECLARE @TableSuffixes TABLE ( Suffix NVARCHAR(128) ); -- Füge die gewünschten Tabellennamen-Endungen hinzu INSERT INTO @TableSuffixes (Suffix) VALUES ('extras'), ('raeume'), ('badewanne'), ('toilette'), ('dusche'), ('waschbecken'), ('allgemein'), ('stammdaten'); -- Neue Tabelle ohne engomoid -- Deklariere eine Tabellenvariable mit den Spalteninformationen DECLARE @ColumnsToAdd TABLE ( TableName NVARCHAR(128), ColumnName NVARCHAR(128), ColumnType NVARCHAR(128) ); -- Füge die gewünschten Spalten hinzu, einschließlich begehung_stammdaten ohne engomoid INSERT INTO @ColumnsToAdd (TableName, ColumnName, ColumnType) VALUES -- begehung_extras (@TablePrefix + 'extras', 'engomoid', 'BIGINT NOT NULL'), (@TablePrefix + 'extras', 'raum_bezeichnung', 'VARCHAR(255)'), (@TablePrefix + 'extras', 'handtuchheizkoerper', 'BIT'), (@TablePrefix + 'extras', 'badetuchhalter', 'BIT'), (@TablePrefix + 'extras', 'waschmaschinenanschluss', 'BIT'), (@TablePrefix + 'extras', 'notizen', 'TEXT'), -- begehung_raeume (@TablePrefix + 'raeume', 'engomoid', 'BIGINT NOT NULL'), (@TablePrefix + 'raeume', 'raumid', 'VARCHAR(255)'), (@TablePrefix + 'raeume', 'raum_bezeichnung', 'VARCHAR(255)'), (@TablePrefix + 'raeume', 'tapezieren', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_tuerblatt', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_tuerrahmen', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_tuerblatt_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'anstrich_heizkoerper', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_heizkoerper_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'anstrich_decke', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_decke_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'anstrich_waende', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_waende_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'anstrich_fenster', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_fenster_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'anstrich_fenstersims', 'BIT'), (@TablePrefix + 'raeume', 'anstrich_fenstersims_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'material_fenster', 'VARCHAR(255)'), (@TablePrefix + 'raeume', 'material_fenstersims', 'VARCHAR(255)'), (@TablePrefix + 'raeume', 'material_bodenbelag', 'VARCHAR(255)'), (@TablePrefix + 'raeume', 'sonstiges_einbauschrank', 'BIT'), (@TablePrefix + 'raeume', 'sonstiges_einbauschrank_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'sonstiges_luefter', 'BIT'), (@TablePrefix + 'raeume', 'sonstiges_luefter_notizen', 'TEXT'), (@TablePrefix + 'raeume', 'notizen_verursachung_mieter', 'TEXT'), (@TablePrefix + 'raeume', 'notizen_instandsetzung_mieter', 'TEXT'), (@TablePrefix + 'raeume', 'notizen_instandsetzung_vermieter', 'TEXT'), -- begehung_badewanne (@TablePrefix + 'badewanne', 'engomoid', 'BIGINT NOT NULL'), (@TablePrefix + 'badewanne', 'raum_bezeichnung', 'VARCHAR(255)'), (@TablePrefix + 'badewanne', 'ablauf_mit_stoepsel', 'BIT'), (@TablePrefix + 'badewanne', 'excenter_garnitur', 'BIT'), (@TablePrefix + 'badewanne', 'griff', 'BIT'), (@TablePrefix + 'badewanne', 'handbrause_mit_schlauch', 'BIT'), -- begehung_dusche (@TablePrefix + 'dusche', 'engomoid', 'BIGINT NOT NULL'), (@TablePrefix + 'dusche', 'raum_bezeichnung', 'VARCHAR(255)'), (@TablePrefix + 'dusche', 'ablagekorb', 'BIT'), (@TablePrefix + 'dusche', 'duschabtrennung', 'BIT'), (@TablePrefix + 'dusche', 'duschkabine', 'BIT'), (@TablePrefix + 'dusche', 'duschstange', 'BIT'), (@TablePrefix + 'dusche', 'duschstange_mit_seifenschale', 'BIT'), (@TablePrefix + 'dusche', 'dusche_bodengleich', 'BIT'), (@TablePrefix + 'dusche', 'duschtasse', 'BIT'), (@TablePrefix + 'dusche', 'handbrause_mit_schlauch', 'BIT'), -- begehung_waschbecken (@TablePrefix + 'waschbecken', 'engomoid', 'BIGINT NOT NULL'), (@TablePrefix + 'waschbecken', 'raum_bezeichnung', 'VARCHAR(255)'), (@TablePrefix + 'waschbecken', 'ablauf_mit_stoepsel', 'BIT'), (@TablePrefix + 'waschbecken', 'doppelhandtuchhalter', 'BIT'), (@TablePrefix + 'waschbecken', 'doppelwaschbecken', 'BIT'), (@TablePrefix + 'waschbecken', 'doppelwaschtisch', 'BIT'), (@TablePrefix + 'waschbecken', 'excenter_garnitur', 'BIT'), (@TablePrefix + 'waschbecken', 'handtuchhalter', 'BIT'), (@TablePrefix + 'waschbecken', 'handtuchhaken', 'BIT'), (@TablePrefix + 'waschbecken', 'konsole', 'BIT'), (@TablePrefix + 'waschbecken', 'seifenschale', 'BIT'), (@TablePrefix + 'waschbecken', 'spiegelleuchte', 'BIT'), (@TablePrefix + 'waschbecken', 'waschbecken', 'BIT'), -- begehung_toilette (@TablePrefix + 'toilette', 'engomoid', 'BIGINT NOT NULL'), (@TablePrefix + 'toilette', 'raum_bezeichnung', 'VARCHAR(255)'), (@TablePrefix + 'toilette', 'sitz_mit_deckel', 'BIT'), (@TablePrefix + 'toilette', 'sitz_mit_deckel_softclose', 'BIT'), (@TablePrefix + 'toilette', 'toilettenpapierhalter', 'BIT'), -- begehung_stammdaten (@TablePrefix + 'stammdaten', 'Vertrag', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Wirtschaftseinheit', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Mietobjekt', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Strasse_und_Hausnummer', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Postleitzahl', 'NVARCHAR(20)'), (@TablePrefix + 'stammdaten', 'Ort', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'LeerstBeleg_ab', 'DATE'), (@TablePrefix + 'stammdaten', 'Geschoss_Kurzbez', 'NVARCHAR(50)'), (@TablePrefix + 'stammdaten', 'Lage_im_Geschoss', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Anzahl_Raeume', 'INT'), (@TablePrefix + 'stammdaten', 'Anzahl_halbe_Raeume', 'INT'), (@TablePrefix + 'stammdaten', 'Hauptnutzflaeche', 'DECIMAL(18,2)'), (@TablePrefix + 'stammdaten', 'Geschaeftspartner', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Mietername', 'NVARCHAR(255)'), (@TablePrefix + 'stammdaten', 'Name_weiterer_Mieter', 'NVARCHAR(255)'); -- Deklariere Variablen für die Tabellen-Schleife DECLARE @CurrentSuffix NVARCHAR(128); DECLARE @FullTableName NVARCHAR(256); DECLARE @CreateTableColumns NVARCHAR(MAX); DECLARE @SQL_CREATE NVARCHAR(MAX); -- Korrigierte Deklaration -- Deklariere und öffne einen Cursor, um durch die Tabellennamen-Endungen zu iterieren DECLARE table_cursor CURSOR FOR SELECT Suffix FROM @TableSuffixes; OPEN table_cursor; FETCH NEXT FROM table_cursor INTO @CurrentSuffix; WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY -- Erstelle den vollständigen Tabellennamen mit dem Präfix SET @FullTableName = @TablePrefix + @CurrentSuffix; -- Überprüfe, ob die Tabelle bereits existiert in der Datenbank 'engomo' IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @FullTableName AND TABLE_SCHEMA = 'dbo' ) BEGIN -- Definiere das CREATE TABLE Statement basierend auf den erlaubten Spalten -- Die Spalteninformationen werden aus @ColumnsToAdd gefiltert SET @CreateTableColumns = ( SELECT STRING_AGG('[' + ColumnName + '] ' + ColumnType, ', ') FROM @ColumnsToAdd WHERE TableName = @FullTableName ); IF @CreateTableColumns IS NULL OR LEN(@CreateTableColumns) = 0 BEGIN PRINT 'Keine Spalten definiert für Tabelle ' + @FullTableName + '. Tabelle wird nicht erstellt.'; END ELSE BEGIN SET @SQL_CREATE = N'CREATE TABLE dbo.[' + @FullTableName + N'] (' + @CreateTableColumns + N');'; -- Führe das dynamische SQL aus EXEC sp_executesql @SQL_CREATE; PRINT 'Tabelle ' + @FullTableName + ' wurde erstellt.'; END END ELSE BEGIN PRINT 'Tabelle ' + @FullTableName + ' existiert bereits.'; END END TRY BEGIN CATCH PRINT 'Fehler beim Erstellen der Tabelle ' + @FullTableName + ': ' + ERROR_MESSAGE(); END CATCH -- Hole den nächsten Suffix FETCH NEXT FROM table_cursor INTO @CurrentSuffix; END -- Schließe und deallokiere den Cursor CLOSE table_cursor; DEALLOCATE table_cursor; -- Füge den PRIMARY KEY für jede Tabelle hinzu, die engomoid hat DECLARE @CurrentTable NVARCHAR(128); DECLARE @PKName NVARCHAR(128); DECLARE @AddPKSQL NVARCHAR(MAX); DECLARE pk_cursor CURSOR FOR SELECT DISTINCT TableName FROM @ColumnsToAdd WHERE ColumnName = 'engomoid'; OPEN pk_cursor; FETCH NEXT FROM pk_cursor INTO @CurrentTable; WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY -- Überprüfe, ob der PRIMARY KEY bereits existiert IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = @CurrentTable AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_SCHEMA = 'dbo' ) BEGIN -- Definiere den Constraint-Namen SET @PKName = 'PK_' + @CurrentTable; -- Definiere das ALTER TABLE Statement zum Hinzufügen des PRIMARY KEY SET @AddPKSQL = N'ALTER TABLE dbo.[' + @CurrentTable + N'] ADD CONSTRAINT [' + @PKName + N'] PRIMARY KEY (engomoid);'; -- Führe das dynamische SQL aus EXEC sp_executesql @AddPKSQL; PRINT 'Primary Key auf engomoid in ' + @CurrentTable + ' wurde hinzugefügt.'; END ELSE BEGIN PRINT 'Primary Key auf engomoid in ' + @CurrentTable + ' existiert bereits.'; END END TRY BEGIN CATCH PRINT 'Fehler beim Hinzufügen des Primary Keys zu ' + @CurrentTable + ': ' + ERROR_MESSAGE(); END CATCH -- Hole den nächsten TableName FETCH NEXT FROM pk_cursor INTO @CurrentTable; END -- Schließe und deallokiere den Cursor CLOSE pk_cursor; DEALLOCATE pk_cursor; -- Deklariere Variablen für die Spalten-Schleife DECLARE @TargetTable NVARCHAR(128); DECLARE @CurrentColumn NVARCHAR(128); DECLARE @ColumnType NVARCHAR(128); DECLARE @AddColumnSQL NVARCHAR(MAX); -- Deklariere und öffne einen Cursor, um durch die Spalten zu iterieren DECLARE column_cursor CURSOR FOR SELECT TableName, ColumnName, ColumnType FROM @ColumnsToAdd; OPEN column_cursor; FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn, @ColumnType; WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY -- Überprüfe, ob die Spalte bereits existiert IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TargetTable AND COLUMN_NAME = @CurrentColumn AND TABLE_SCHEMA = 'dbo' ) BEGIN -- Definiere das ALTER TABLE Statement zum Hinzufügen der Spalte SET @AddColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] ADD [' + @CurrentColumn + N'] ' + @ColumnType + N';'; -- Führe das dynamische SQL aus EXEC sp_executesql @AddColumnSQL; PRINT 'Spalte ' + @CurrentColumn + ' wurde zu ' + @TargetTable + ' hinzugefügt.'; END ELSE BEGIN PRINT 'Spalte ' + @CurrentColumn + ' existiert bereits in ' + @TargetTable + '.'; END END TRY BEGIN CATCH PRINT 'Fehler beim Hinzufügen der Spalte ' + @CurrentColumn + ' zu ' + @TargetTable + ': ' + ERROR_MESSAGE(); END CATCH -- Hole die nächste Spalte FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn, @ColumnType; END -- Schließe und deallokiere den Spalten-Cursor CLOSE column_cursor; DEALLOCATE column_cursor; -- Deklariere Variablen für die Lösch-Schleife DECLARE @ExistingColumnLoop NVARCHAR(128); DECLARE @DeleteColumnSQL NVARCHAR(MAX); -- Deklariere und öffne einen Cursor, um durch die Tabellen zu iterieren DECLARE delete_cursor CURSOR FOR SELECT DISTINCT TableName FROM @ColumnsToAdd; OPEN delete_cursor; FETCH NEXT FROM delete_cursor INTO @TargetTable; WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY -- Hole alle existierenden Spalten in der Tabelle DECLARE @ExistingColumns TABLE (ColumnName NVARCHAR(128)); INSERT INTO @ExistingColumns (ColumnName) SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TargetTable AND TABLE_SCHEMA = 'dbo'; -- Iteriere durch jede existierende Spalte DECLARE ExistingColumnCursor CURSOR LOCAL FAST_FORWARD FOR SELECT ColumnName FROM @ExistingColumns; OPEN ExistingColumnCursor; FETCH NEXT FROM ExistingColumnCursor INTO @ExistingColumnLoop; WHILE @@FETCH_STATUS = 0 BEGIN -- Überprüfe, ob die Spalte in den erlaubten Spalten ist IF NOT EXISTS ( SELECT 1 FROM @ColumnsToAdd WHERE TableName = @TargetTable AND ColumnName = @ExistingColumnLoop ) BEGIN BEGIN TRY -- Definiere das ALTER TABLE Statement zum Löschen der Spalte SET @DeleteColumnSQL = N'ALTER TABLE dbo.[' + @TargetTable + N'] DROP COLUMN [' + @ExistingColumnLoop + N'];'; -- Führe das dynamische SQL aus EXEC sp_executesql @DeleteColumnSQL; PRINT 'Spalte ' + @ExistingColumnLoop + ' wurde aus ' + @TargetTable + ' gelöscht.'; END TRY BEGIN CATCH -- Ignoriere den Fehler und fahre fort PRINT 'Fehler beim Löschen der Spalte ' + @ExistingColumnLoop + ' aus ' + @TargetTable + ': ' + ERROR_MESSAGE(); END CATCH END ELSE BEGIN PRINT 'Spalte ' + @ExistingColumnLoop + ' ist erlaubt in ' + @TargetTable + '.'; END FETCH NEXT FROM ExistingColumnCursor INTO @ExistingColumnLoop; END -- Schließe und deallokiere den existierenden Spalten-Cursor CLOSE ExistingColumnCursor; DEALLOCATE ExistingColumnCursor; END TRY BEGIN CATCH PRINT 'Fehler beim Überprüfen/Löschen von Spalten in ' + @TargetTable + ': ' + ERROR_MESSAGE(); END CATCH -- Hole den nächsten TableName FETCH NEXT FROM delete_cursor INTO @TargetTable; END -- Schließe und deallokiere den Lösch-Cursor CLOSE delete_cursor; DEALLOCATE delete_cursor;