Syntaxanalyse in durch IF EXISTS nicht erreichbarem Code umgehen

spufi77

Neuer Benutzer
Beiträge
4
Hallo Forum, ich habe folgendes Problem.
Auf dem SQL Server sind mehrere Datenbanken. Diese Datenbanken können eine Tabelle "Event" in 2 Versionen haben. Einmal mit der Spalte "nurInNeuerVersion", oder eben ohne.

Ich möchte eine Aufstellung haben der Datenbanken der neuen Version und der Daten in "nurInNeuerVersion". Dazu habe ich einen Cursor erstellt

DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state = 0
AND name NOT IN ('master', 'tempdb', 'model', 'msdb');

der mit ein @sql zusammenbaut, welches ich mit EXEC sp_executesql @sql; dann ausführe.

Das ist der SQL der zusammengebaut wird:
IF EXISTS (SELECT 1 FROM [DB1].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Events' AND COLUMN_NAME = 'nurInNeuerVersion')
BEGIN
INSERT INTO #EventResults (EventId, DatabaseName, nurInNeuerVersion) SELECT EventId, 'DB1' AS DatabaseName, nurInNeuerVersion FROM [DB1].dbo.Events;
END
IF EXISTS (SELECT 1 FROM [DB2].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Events' AND COLUMN_NAME = 'nurInNeuerVersion')
BEGIN
INSERT INTO #EventResults (EventId, DatabaseName, nurInNeuerVersion) SELECT EventId, 'DB2' AS DatabaseName, nurInNeuerVersion FROM [DB2].dbo.Events;
END
usw.

PROBLEM:
Auch wenn EXISTS Bedingung funktioniert (gibt nur 1 bei neuen DBs zurück), kommt bei der Ausführung für jede alte DB der Fehler "Ungültiger Spaltenname "nurInNeuerVersion"." Nehme ich "nurInNeuerVersion" beim INSERT raus, werden mir auch nur EventID und DatabaseName der neuen Version angezeigt. Kann ich die Syntaxanalyse von Code der nicht ausgeführt wird irgendwie ausschalten? Oder irgendein ganz andererer Vorschlag?
 
Werbung:
IF EXISTS (SELECT 1 FROM [DB1].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Events' AND COLUMN_NAME = 'nurInNeuerVersion')
BEGIN
INSERT INTO #EventResults (EventId, DatabaseName, nurInNeuerVersion) SELECT EventId, 'DB1' AS DatabaseName, nurInNeuerVersion FROM [DB1].dbo.Events;
END
Hier kann man nicht sehen, für welche Tabelle und Datenbank #EventResults steht. Vielleicht selektierst Du alles richtig, aber fügst in die falsche DB ein.
 
Werbung:
Hallo Forum, ich habe folgendes Problem.
Auf dem SQL Server sind mehrere Datenbanken. Diese Datenbanken können eine Tabelle "Event" in 2 Versionen haben. Einmal mit der Spalte "nurInNeuerVersion", oder eben ohne.

Ich möchte eine Aufstellung haben der Datenbanken der neuen Version und der Daten in "nurInNeuerVersion". Dazu habe ich einen Cursor erstellt

DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state = 0
AND name NOT IN ('master', 'tempdb', 'model', 'msdb');

der mit ein @sql zusammenbaut, welches ich mit EXEC sp_executesql @sql; dann ausführe.

Das ist der SQL der zusammengebaut wird:
IF EXISTS (SELECT 1 FROM [DB1].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Events' AND COLUMN_NAME = 'nurInNeuerVersion')
BEGIN
INSERT INTO #EventResults (EventId, DatabaseName, nurInNeuerVersion) SELECT EventId, 'DB1' AS DatabaseName, nurInNeuerVersion FROM [DB1].dbo.Events;
END
IF EXISTS (SELECT 1 FROM [DB2].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Events' AND COLUMN_NAME = 'nurInNeuerVersion')
BEGIN
INSERT INTO #EventResults (EventId, DatabaseName, nurInNeuerVersion) SELECT EventId, 'DB2' AS DatabaseName, nurInNeuerVersion FROM [DB2].dbo.Events;
END
usw.

PROBLEM:
Auch wenn EXISTS Bedingung funktioniert (gibt nur 1 bei neuen DBs zurück), kommt bei der Ausführung für jede alte DB der Fehler "Ungültiger Spaltenname "nurInNeuerVersion"." Nehme ich "nurInNeuerVersion" beim INSERT raus, werden mir auch nur EventID und DatabaseName der neuen Version angezeigt. Kann ich die Syntaxanalyse von Code der nicht ausgeführt wird irgendwie ausschalten? Oder irgendein ganz andererer Vorschlag?
Die Syntax ist ja richtig. Der Fehler tritt beim Ausführen auf und da ist die Syntaxprüfung schon rum. Das Stichwort wonach du suchen mußt heißt Processing Order oder Execution Order.
 
Zurück
Oben