Ich wünschte, ich könnte etwas in SQl Server 2005 (das ich weiß, ist nicht gültig) für meine WHERE-Klausel tun. Manchmal ist @teamID (übergeben an eine gespeicherte Prozedur) der Wert einer existierenden teamID, sonst ist es immer Null und ich möchte alle Zeilen aus der Team Tabelle.
Ich habe mit Case geforscht und der Operator muss vor oder nach der gesamten Aussage kommen, was verhindert, dass ich einen anderen Operator habe, basierend auf dem Wert von @teamid. Andere Vorschläge als das Duplizieren meiner Select-Anweisungen.
%Vor%Ohne dynamisches SQL zu verwenden, ist die leistungsstärkste Option:
%Vor%Verwenden von dynamischem SQL:
%Vor% Beachten Sie, dass sp_EXECUTESQL
den Abfrageplan zwischenspeichert, während EXEC dies nicht tut. Lesen Sie dies: Ссылка
Noch einfacher als Andomars Antwort und unter der Annahme, dass id niemals 0 ist (wie bei den meisten Auto-Inkrement-IDs) ist
%Vor%Dieses Prädikat ist immer wahr, wenn @teamid Null ist und ansonsten nur wahr, wenn es mit der TeamId einer bestimmten Zeile übereinstimmt.
Beachten Sie jedoch: Dies funktioniert ziemlich effizient auf Sybase 11 oder höher; es funktionierte ziemlich ineffizient auf MS SQL Server 2003; Ich weiß nicht, wie es auf der aktuellen Version von MS SQL Server funktioniert.
Sie können auch Groß- / Kleinschreibung verwenden; Sie müssen nur den Fall in Where-Klausel setzen, nicht die Where-Klausel in dem Fall. Ihre ursprüngliche Abfrage wäre also:
%Vor%Beachten Sie, dass dies jedoch wahrscheinlich weniger effizient ist, da es pro Zeile ausgewertet werden muss und wahrscheinlich auch zu einem vollständigen Tabellenscan führt.
Das Formular, das ich oben angegeben habe, wird wahrscheinlich von einem intelligenten Abfrageoptimierer neu geschrieben (Ihr Kilometerstand hängt von Ihrem RDBMS ab), um einen Index zu verwenden, wenn @teamid nicht Null ist.
Tags und Links sql sql-server sql-server-2005 tsql