2017-07-27 4 views
3

Gibt es eine Möglichkeit, die arithmetischen Operatoren (<,>, =,> =, < =) in T-SQL zu parametrisieren?T-SQL: Parameter als Operator verwenden

Etwas wie folgt aus:

DECLARE @Operator 

SET @Operator = '>=' 

SELECT * 
FROM Table 
WHERE Date @Operator '7/1/2017' 

Auch teste ich zusätzliche Parameter hinzuzufügen Funktionen EXEC('SELECT SiteLongName, * FROM Reporting.Survey_Details WHERE CallDate ' + @Operator + '''7/1/2017''' + 'and SiteLongName in (select value from dbo.FnSplit(''' + @Site + ''''+'',''+'','')), aber es ist erroring aus.

+1

Ein 'case' Ausdruck kann verwendet werden, z.B. 'Fall wenn @Operator = '> =' und Col> = @Val dann 1 wenn @Operator = '=' und Col = @Val dann 1 ... else 0 Ende = 1 ', aber die Leistung wäre ein Problem. Für einen kleinen Datensatz kann es ausreichen. Und es vermeidet, [Bobby Tables] zu treffen (http://bobby-tables.com/). – HABO

+0

Leistung wird ein Problem für den Bericht, den ich in SSRS erstellen, da es große monatliche Anrufdaten mit mehreren Berichtsparametern enthält. Ich bin nur besorgt über die Verwendung der arithmetischen Operator als Parameter, aber jetzt im testing die Aufnahme einer SQL-Funktion. – Arsee

Antwort

4

Sie können, wenn Sie dynamisches SQL verwenden.

Beispiel:

DECLARE @Operator VARCHAR(2) 

SET @Operator = '>=' 

EXEC('SELECT * FROM TABLE WHERE Date ' + @Operator + ' ''7/1/2017''') 

Wie Sie im Beispiel Umgang mit Anführungszeichen in dynamischen SQL sehen kann, kann ein Schmerz sein. Obwohl es in Ihrem Beispiel keine große Sache ist.

Beachten Sie, dass dynamisches SQL ohne entsprechende Sorgfalt eine Sicherheitslücke in Ihrem System öffnet, in der Benutzer SQL Injection Angriffe auf Ihr Programm verwenden können.

+0

Essen für mein Gehirn! Vielen Dank @AXMIM .. – Arsee

+0

Was ist, wenn ich einen anderen Parameter @Site möchte? Wie integriere ich das? EXEC ('SELECT * FROM Reporting.Survey_Details WHERE CallDate' + @Operator + '' '7/1/2017' '' + '[SiteLongName] =' + @Site) ?? – Arsee

+0

@arsee Ja, das musst du tun. Achten Sie bei der Verkettung von Teilen der dynamischen Abfrage auf Leerzeichen. Fehlende Leerzeichen führen zu einem falschen Syntaxfehler in der letzten Abfrage. Da es dynamisch ist, wissen Sie nur zur Laufzeit, ob die letzte Abfrage kompiliert wird oder nicht. – AXMIM

Verwandte Themen