Laden...

Subselect bei Bedingung nicht ausführen

Erstellt von tkrasinger vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.196 Views
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren
Subselect bei Bedingung nicht ausführen

verwendetes Datenbanksystem: SQL Server 2005

DECLARE @s int

SELECT * FROM sys.sysobjects WHERE @s is null OR name in ( SELECT name FROM sys.syscolumns)

Im Ausführungsplan stelle ich fest, dass das SubSelect auf die syscolumns ausgeführt wird, obwohl @s immer null ist (setze es ja nie).
Wie kann ich das oben angeführte Statement absetzen, ohne dass der Server durch die syscolumns durch muss?

(Das Statement ist natürlich nur beispielhaft, ich brauch so was ähnliches natürlich für meine Echt-Tabellen, und ich will verhindern, dass zuviele Daten abgefragt werden, wenns gar nicht gebraucht wird)

S
26 Beiträge seit 2009
vor 14 Jahren

Hallo tkrassinger,

im Grunde macht die Abfrage genau das was sie machen soll da bei einem "OR" immer beide Ausdrücke ausgewertet werden.
So ganz ist mir deine Abfrage aber auch nicht klar. Suchst du eine Art "oder Operator" wie bei C#, (| oder ||) bei dem der zweite Ausdruck nur ausgewerter wird, wenn der erste false ergibt?

Viele Grüße

Sebastian

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

Ja, in C# wird bei einem OR (also ||) auch nur bis dahin ausgewertet, wo das OR evtl. noch negativ werden könnte.
Genau sowas bräuchte ich jetzt auch am SQL Server.

S
26 Beiträge seit 2009
vor 14 Jahren

Hmm,
da ich deine Abfrage nicht kenne, kann ich jetzt nur drauf los raten. Aber wie würde es mit einem "CASE WHEN THEN" aussenen?

Sebastian

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

Wie soll ich das CASE in die WHERE Klausel bringen? Kannst du mir das anhand meines Beispiels vom Startbeitrag zeigen? Das Echtbeispiel kann ich das zu 99% genauso machen.

S
26 Beiträge seit 2009
vor 14 Jahren

Ich dachte da mehr an ein Dynamisches SQL oder zwei Abfragen die je nach "Vorauswahl" die entsprechende WHERE Klausel haben.

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo tkrasinger

Du kannst die Reihenfolge in der die Kriterien von SQL Server ausgewertet werden (eigentlich) nicht beeinflussen.

Ich würde dir, wie Sebastian, auch empfehlen dynamisches SQL zu verwenden. Ist zwar nicht ganz so schick, aber dein Statement riecht für mich nach einer typischen Catch All Query und damit wirst du schnell massive Performance-Probleme bekommen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 14 Jahren

@Florian:

Danke für deinen Beitrag. Da hab ich wohl noch einiges zu überdenken.

1.564 Beiträge seit 2007
vor 14 Jahren

Danke für dein Feedback. Freut mich wenn wir helfen konnten!

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.