Überprüfen, ob Spalte in temporäre Tabelle existiert, gibt immer false in SQL server zurück

Ich habe die folgende Execution-statement, die eine Tabelle erstellt (mit data aus einer anderen Prozedur), fügt die Werte in eine temporäre Tabelle ein, fügt eine imagespalte hinzu (weil sie nicht in die Gruppierung aufgenommen werden können) und sie dann auf der Grundlage von Kriterien von einem anderen aktualisiert temporäre Tabelle (die resultierenden Tabellenfelder werden in einem SSRS-Report verwendet, also muss ich den BILD-datatyp beibehalten):

EXEC ('SELECT ' + @COL_TO_GROUP_BY + @COL_ADDITONAL + @sColVals + ' INTO #RESULTS_TABLE from (' + @SQL_STATEMENT + ') A ' + @WHERE_CLAUSE + ' GROUP BY ' + @COL_TO_GROUP_BY + ' ALTER TABLE #RESULTS_TABLE ADD IMAGE_DATA IMAGE IF EXISTS(SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = ''COLUMN_A'' and TABLE_NAME LIKE ''#RESULTS_TABLE%'') BEGIN UPDATE #RESULTS_TABLE SET IMAGE_DATA = FILE_DATA FROM #RESULTS_TABLE A, #IMAGE_TABLE B WHERE A.COLUMN_A = B.COLUMN_A END SELECT * FROM #RESULTS_TABLE') 

Das Problem ist, dass unabhängig davon, ob COLUMN_A existiert oder nicht, die Spalte für IMAGE_DATA immer NULL ist. Gibt es eine andere Möglichkeit, data in die Spalte IMAGE_DATA zu bekommen? Bitte helfen!

Anmerkung: Ich nehme keine Antworten an, die schließen, dass das Problem mit dem Inhalt in anderen Tabellen zusammenhängt, genauer aus der WHERE-Klausel. Ich habe mehrere validationen durchgeführt, um sicherzustellen, dass die Bedingungen sowohl wahr als auch falsch sein können (passende Zeilen, keine übereinstimmenden Zeilen, etc ..). So schließt das die bedingte Aussage aus. Vielen Dank.

BEARBEITEN:

Ich bin immer noch nicht ganz sicher, was die genaue Ursache dafür war, aber ich landete eine globale temporäre Tabelle und lief zwei getrennte Verfahren, jetzt scheint es gut zu funktionieren. Ich musste die Antwort akzeptieren, die am ehesten meiner eigenen Lösung entspricht. Alle Antworten und Kommentare waren sehr tragfähig. Vielen Dank!

Richtig.

Zum timepunkt der Kompilierung existiert die Spalte nicht. Das heißt, SQL server schaut auf den ganzen Satz von Befehlen und analysiert / kompiliert es. Die Effekte einer ALTER TABLE im Code sind für spätere Befehle nicht sichtbar.

Sie müssen die ALTER TABLE separat zum UPDATE machen

Hinweis: Für SQL server 2005 hättest du varbinary (max), was viel flexibler ist und eine gewisse Komplexität beseitigt

Sie haben mehrere Probleme in Ihrem Skript:

  • TempDB ist nicht der richtige Name von tempdb . Ihr Code wird auf einem server mit einer case sensitive sorting installiert. Verwenden Sie für alle databasenamen immer den richtigen Fall. Sie Code wird wahrscheinlich ähnlich auf die Ergebnis Spaltennamen, wie COLUMN_A , wenn unter einer case sensitive Deployment ausgeführt.
  • Die Logik ist unter Parallelität falsch: Session A wird die #temp-Tabelle der Session B sehen und falsche Aktionen ausführen.
  • Ein einfacher Test zeigt, dass die Spalten sichtbar sind:

.

 EXEC ('SELECT * INTO #RESULTS_TABLE from (select *, newid() as COLUMN_A from master..spt_values) A; ALTER TABLE #RESULTS_TABLE ADD IMAGE_DATA varbinary(max); IF EXISTS(SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = ''COLUMN_A'' and TABLE_NAME LIKE ''#RESULTS_TABLE%'') BEGIN update #RESULTS_TABLE set IMAGE_DATA = 0xBAADF00D; END SELECT * FROM #RESULTS_TABLE') 

Dieser Test zeigt, dass die Spalte aktualisiert wurde, so dass die Prüfung auf EXISTS gelungen ist. Die offensichtliche Schlussfolgerung ist, dass in Ihrem Fall die OBJ_ID join zwischen #RESULTS_TABLE und #IMAGE_TABLE findet keine Übereinstimmung, was ein Problem ist, das ganz vom Inhalt Ihrer Tabellen abhängt.

Bearbeiten

Sie können die COLUMN_A dynamisch machen, es funktioniert immer noch gut, wenn getestet:

 declare @cn sysname = case when RAND() * 100 >= 50 then 'COLUMN_A' else 'COLUMN_B' end; EXEC (N'SELECT * INTO #RESULTS_TABLE from ( select *, newid() as ' + @cn + N' from master..spt_values) A; ... 

Sie können überprüfen, ob Spalte in der temporären Tabelle vorhanden ist, indem Sie ..

 IF EXISTS (SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'Column' AND TABLE_NAME LIKE '#TempTable%') PRINT 'Column exists' ELSE PRINT 'Column doesn''t exists'