2016-06-06 1 views
0

Gibt es eine Möglichkeit, Teile einer SQL-Anweisung basierend auf deklarierten Werten auszuschließen?SQL Verwenden Sie Declare, um Where-Klausel-Elemente zu ignorieren

Zum Beispiel;

DECLARE @OnlyY as VARCHAR(1) = 'Y' 

SELECT count(*) from main where IDATE > '2016-01-01' 

If @OnlyY = 'Y' THEN 
    AND Qualify = 'Y' 
END IF 

In diesem Fall, wenn @OnlyY nicht Y ist dann der Teil zwischen dem if/endif nicht passieren würde.

Der Grund, den ich brauche, ist, weil ich eine Access 97-Anwendung auf .NET portiere. In der Access 97-Anwendung gibt es einen Teil, der eine temporäre Tabelle erstellt und dann einen Bericht aus dieser Tabelle generiert. Das involvierte SQL ist eine riesige Menge von if/then Anweisungen, die Daten aus der temporären Tabelle entfernen. Ich bin in der Lage, die DataTable zum Anzeigen in einer Datagridview zu erstellen. Mein Problem ist, dass ich eine SSRS nicht bekommen kann, um die gleiche Flexibilität wie .NET in den if/then Anweisungen zu haben.

Also, wie soll ich das machen?

Antwort

1

Eine Option, die Sie betrachten können, ist Dynamic SQL, in dem Sie alles dynamisch ändern können, was Sie benötigen würden.

DECLARE @SQL AS NVARCHAR(MAX) 
SET @SQL = N'SELECT COUNT(*) FROM main WHERE IDATE > ''2016-01-01''' 

IF @OnlyY = 'Y' 
BEGIN 
    SET @SQL += N' AND Qualify = ''Y''' 
END 

EXECUTE sp_executesql @SQL 
+0

Dies ist, was ich fast gesucht habe. Ich musste() um das '@OnlyY =' Y 'setzen und DANN zu BEGIN und ENDE IF zu END wechseln. Ansonsten, danke. Ich hatte keine Ahnung, dass das möglich war. Jetzt muss ich es vor einem Injektionsangriff schützen. – Kayot

+0

Willkommen, Tippfehler meinerseits. Das Schöne an dieser Lösung ist, dass Sie dynamisch zu Ihrer 'Where'-Klausel hinzufügen können. Der Nachteil hierbei ist, dass die Ausführung der Abfrage zu diesem Zeitpunkt nicht optimiert ist, da sie dynamisch ist und nicht zwischengespeichert wird, sondern dass Bedingungen dynamisch hinzugefügt werden können, wenn Sie dies benötigen. – Codexer

2

Try this:

SELECT COUNT(*) 
FROM main 
WHERE IDATE > '2016-01-01' AND 
     ((Qualify = 'Y') OR (@OnlyY <> 'Y')) 

Wenn @OnlyY nicht gleich 'Y' ist, dann ist die WHERE Klausel läuft darauf hinaus:

WHERE IDATE > '2016-01-01' 

sonst WHERE Klausel wird:

WHERE IDATE > '2016-01-01' AND (Qualify = 'Y')