IF OBJECT_ID('dbo.begehung_errorlog', 'U') IS NOT NULL BEGIN DROP TABLE [dbo].[begehung_errorlog]; END CREATE TABLE [dbo].[begehung_errorlog] ( [ErrorID] INT IDENTITY(1,1) PRIMARY KEY, [ErrorMessage] NVARCHAR(MAX) NOT NULL, [ErrorTime] DATETIME NOT NULL ); -- 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) ); -- Deklariere eine Tabellenvariable mit den Spalteninformationen DECLARE @ColumnsToAdd TABLE ( TableName NVARCHAR(128), ColumnName NVARCHAR(128) ); -- Deklariere Variablen für die Tabellen-Schleife DECLARE @CurrentSuffix NVARCHAR(128); DECLARE @FullTableName NVARCHAR(256); DECLARE @CreateTableColumns NVARCHAR(MAX); DECLARE @SQL_CREATE NVARCHAR(MAX); -- Deklariere Variablen für die PRIMARY KEY Schleife DECLARE @CurrentTable NVARCHAR(128); DECLARE @PKName NVARCHAR(128); DECLARE @AddPKSQL NVARCHAR(MAX); -- Deklariere Variablen für die Spalten-Schleife DECLARE @TargetTable NVARCHAR(128); DECLARE @CurrentColumn NVARCHAR(128); DECLARE @AddColumnSQL NVARCHAR(MAX); -- Deklariere Variablen für die Lösch-Schleife DECLARE @ExistingColumnLoop NVARCHAR(128); DECLARE @DeleteColumnSQL NVARCHAR(MAX); -- Füge die gewünschten Tabellennamen-Endungen hinzu INSERT INTO @TableSuffixes (Suffix) VALUES ('extras'), ('raeume'), ('badewanne'), ('toilette'), ('dusche'), ('waschbecken'), ('allgemein'), ('usersettings'); -- Füge die gewünschten Spalten hinzu INSERT INTO @ColumnsToAdd (TableName, ColumnName) VALUES -- begehung_extras (@TablePrefix + 'extras', 'engomoid'), (@TablePrefix + 'extras', 'raum_bezeichnung'), (@TablePrefix + 'extras', 'handtuchheizkoerper'), (@TablePrefix + 'extras', 'badetuchhalter'), (@TablePrefix + 'extras', 'waschmaschinenanschluss'), (@TablePrefix + 'extras', 'notizen'), -- begehung_raeume (@TablePrefix + 'raeume', 'engomoid'), (@TablePrefix + 'raeume', 'raumid'), (@TablePrefix + 'raeume', 'raum_bezeichnung'), (@TablePrefix + 'raeume', 'tapezieren'), (@TablePrefix + 'raeume', 'anstrich_tuerblatt'), (@TablePrefix + 'raeume', 'anstrich_tuerrahmen'), (@TablePrefix + 'raeume', 'anstrich_tuerblatt_notizen'), (@TablePrefix + 'raeume', 'anstrich_heizkoerper'), (@TablePrefix + 'raeume', 'anstrich_heizkoerper_notizen'), (@TablePrefix + 'raeume', 'anstrich_decke'), (@TablePrefix + 'raeume', 'anstrich_decke_notizen'), (@TablePrefix + 'raeume', 'anstrich_waende'), (@TablePrefix + 'raeume', 'anstrich_waende_notizen'), (@TablePrefix + 'raeume', 'anstrich_fenster'), (@TablePrefix + 'raeume', 'anstrich_fenster_notizen'), (@TablePrefix + 'raeume', 'anstrich_fenstersims'), (@TablePrefix + 'raeume', 'anstrich_fenstersims_notizen'), (@TablePrefix + 'raeume', 'material_fenster'), (@TablePrefix + 'raeume', 'material_fenstersims'), (@TablePrefix + 'raeume', 'material_bodenbelag'), (@TablePrefix + 'raeume', 'sonstiges_einbauschrank'), (@TablePrefix + 'raeume', 'sonstiges_einbauschrank_notizen'), (@TablePrefix + 'raeume', 'sonstiges_luefter'), (@TablePrefix + 'raeume', 'sonstiges_luefter_notizen'), (@TablePrefix + 'raeume', 'notizen_verursachung_mieter'), (@TablePrefix + 'raeume', 'notizen_instandsetzung_mieter'), (@TablePrefix + 'raeume', 'notizen_instandsetzung_vermieter'), -- begehung_badewanne (@TablePrefix + 'badewanne', 'engomoid'), (@TablePrefix + 'badewanne', 'raum_bezeichnung'), (@TablePrefix + 'badewanne', 'ablauf_mit_stoepsel'), (@TablePrefix + 'badewanne', 'excenter_garnitur'), (@TablePrefix + 'badewanne', 'griff'), (@TablePrefix + 'badewanne', 'handbrause_mit_schlauch'), -- begehung_dusche (@TablePrefix + 'dusche', 'engomoid'), (@TablePrefix + 'dusche', 'raum_bezeichnung'), (@TablePrefix + 'dusche', 'ablagekorb'), (@TablePrefix + 'dusche', 'duschabtrennung'), (@TablePrefix + 'dusche', 'duschkabine'), (@TablePrefix + 'dusche', 'duschstange'), (@TablePrefix + 'dusche', 'duschstange_mit_seifenschale'), (@TablePrefix + 'dusche', 'dusche_bodengleich'), (@TablePrefix + 'dusche', 'duschtasse'), (@TablePrefix + 'dusche', 'handbrause_mit_schlauch'), -- begehung_waschbecken (@TablePrefix + 'waschbecken', 'engomoid'), (@TablePrefix + 'waschbecken', 'raum_bezeichnung'), (@TablePrefix + 'waschbecken', 'ablauf_mit_stoepsel'), (@TablePrefix + 'waschbecken', 'doppelhandtuchhalter'), (@TablePrefix + 'waschbecken', 'doppelwaschbecken'), (@TablePrefix + 'waschbecken', 'doppelwaschtisch'), (@TablePrefix + 'waschbecken', 'excenter_garnitur'), (@TablePrefix + 'waschbecken', 'handtuchhalter'), (@TablePrefix + 'waschbecken', 'handtuchhaken'), (@TablePrefix + 'waschbecken', 'konsole'), (@TablePrefix + 'waschbecken', 'seifenschale'), (@TablePrefix + 'waschbecken', 'spiegelleuchte'), (@TablePrefix + 'waschbecken', 'waschbecken'), -- begehung_toilette (@TablePrefix + 'toilette', 'engomoid'), (@TablePrefix + 'toilette', 'raum_bezeichnung'), (@TablePrefix + 'toilette', 'sitz_mit_deckel'), (@TablePrefix + 'toilette', 'sitz_mit_deckel_softclose'), (@TablePrefix + 'toilette', 'toilettenpapierhalter'), -- begehung_usersettings (@TablePrefix + 'usersettings', 'user_mail'), (@TablePrefix + 'usersettings', 'user_theme'); /* === BEGIN TABLE CREATION LOOP === */ -- 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 SET @CreateTableColumns = ( SELECT STRING_AGG('[' + ColumnName + '] NVARCHAR(255)', ', ') 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 INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) VALUES ('Fehler beim Erstellen der Tabelle ' + @FullTableName + ': ' + ERROR_MESSAGE(), GETDATE()); 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; /* === END TABLE CREATION LOOP === */ /* === BEGIN PRIMARY KEY ADDITION LOOP === */ -- Füge den PRIMARY KEY für jede Tabelle hinzu, die engomoid hat 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 INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) VALUES ('Fehler beim Hinzufügen des Primary Keys zu ' + @CurrentTable + ': ' + ERROR_MESSAGE(), GETDATE()); 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; /* === END PRIMARY KEY ADDITION LOOP === */ /* === BEGIN COLUMN ADDITION LOOP === */ -- Deklariere und öffne einen Cursor, um durch die Spalten zu iterieren DECLARE column_cursor CURSOR FOR SELECT TableName, ColumnName FROM @ColumnsToAdd; OPEN column_cursor; FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn; 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'] NVARCHAR(255);'; -- 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 INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) VALUES ('Fehler beim Hinzufügen der Spalte ' + @CurrentColumn + ' zu ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE()); END CATCH -- Hole die nächste Spalte FETCH NEXT FROM column_cursor INTO @TargetTable, @CurrentColumn; END -- Schließe und deallokiere den Spalten-Cursor CLOSE column_cursor; DEALLOCATE column_cursor; /* === END COLUMN ADDITION LOOP === */ /* === BEGIN COLUMN DELETION LOOP === */ -- 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 INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) VALUES ('Fehler beim Löschen der Spalte ' + @ExistingColumnLoop + ' aus ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE()); 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 INSERT INTO dbo.begehung_errorlog (ErrorMessage, ErrorTime) VALUES ('Fehler beim Überprüfen/Löschen von Spalten in ' + @TargetTable + ': ' + ERROR_MESSAGE(), GETDATE()); 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; /* === END COLUMN DELETION LOOP === */