Dynamisches Ändern der Tabelle, aus der mit der SQL CASE-Anweisung ausgewählt werden soll

Ich versuche, eine gespeicherte Prozedur zu schreiben, und je nach einem bestimmten Spaltenwert möchte ich in der Lage sein, die Tabelle zu ändern, aus der ich auswähle. Ich werde versuchen, ein Beispiel zu geben:

SELECT ItemNumber,
       ItemType, 
       Description
FROM

CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END

WHERE 

CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END

Wie Sie sehen können, ändere ich nicht nur dynamisch die Tabelle, aus der ich auswähle, sondern da diese beiden Tabellen zu zwei verschiedenen Zeiten von zwei verschiedenen Personen erstellt wurden, sind auch die Spaltennamen unterschiedlich.

Also, meine Frage ist: Was ist der beste Weg, dies zu erreichen, da SQL Server scheint nicht wie meine Abfrage, die ich erstellt habe.

Wenn jemand, der sieht, was ich zu tun versuche, einen besseren Weg vorschlagen kann, dies zu tun, wäre ich alle Ohren :-)

Antwort auf "Dynamisches Ändern der Tabelle, aus der mit der SQL CASE-Anweisung ausgewählt werden soll " 5 von antworten

Sie sind besser darin, die UNION-Abfrage zu verwenden, um die Tabellen zuerst zu verknüpfen, und dann SELECT.

Außerdem können Sie eine Ansicht für eine der Tabellen erstellen, sodass nur die Spalten gezogen werden, die Sie beim Umbenennen benötigen, dann UNION, und dann aus der UNION auswählen.

Oder verwenden Sie eine temporäre Tabelle, um das Ergebnis jeder Abfrage zu speichern. Setzen Sie die Erstellung der temporären Tabelle in ein CASE (Pseudocode, nicht getestet):

CASE @itemType
   WHEN 'A'
      SELECT ACol1 AS Col1, ACol2 AS Col2
      FROM TABLE_A
      INTO #tempTable
      WHERE ItemNumber = @itemNumber
   ELSE
      SELECT BCol1 AS Col1, BCol2 AS Col2
      FROM TABLE_B
      INTO #tempTable
      WHERE PartNumber = @itemNumber
END

SELECT * FROM #tempTable

Sie können versuchen, die dynamische SQL-Anweisung als Zeichenfolge zu erstellen und dann die sp_executesql gespeicherte Prozedur aufzurufen, um die Zeichenfolge auszuführen.

Siehe here for more information and examples. für weitere Informationen und Beispiele.

Sie erklären wirklich nicht, woher ItemType is coming from. As suggested kommt. Wie vorgeschlagen, könnte UNION might be applicable if you are simply combining two tables. anwendbar sein, wenn Sie einfach zwei Tabellen kombinieren.

Hier ist eine weitere Möglichkeit, die sich auf Ihr Problem beziehen kann:

SELECT ItemNumber,
       ItemType, 
       COALESCE(TableA.Description, TableB.Description) AS Description
FROM Items
LEFT JOIN TableA
    ON Items.ItemType = 'A'
    AND TableA.ItemNumber = Items.ItemNumber
LEFT JOIN TableB
    ON Items.ItemType <> 'A'
    AND TableB.ItemNumber = Items.ItemNumber

Sie können die CASE-Anweisung nicht in der FROM-Klausel verwenden, aber Sie können stattdessen Folgendes verwenden:

SELECT itemnumber, itemtype, description
  FROM tablea
 WHERE itemnumber = @itemnumber AND itemtype = 'A'
UNION ALL
SELECT itemnumber, itemtype, description
  FROM tableb
 WHERE partnumber = @itemnumber AND itemtype <> 'A'

Ich bin mir nicht sicher, warum Sie Dinge in einer SQL-Anweisung tun möchten .. Ich bin keine SQL Server-Person, aber in einer gespeicherten Oracle-Prozedur könnte man so etwas schreiben wie dieses

If itemtype = 'A' 
Then 
 <statement for table A>
Else
 <statement for Table B>
End if

Etwas wie dieses sollte auch in SQL Server funktionieren .. vielleicht könnte jemand darauf eingehen?