2017-02-22 8 views
-1

Ich muss dynamisch SQL erstellen, ich habe eine Tabelle wie folgt aus:Dynamische SQL basierend auf Werten in Tabelle

Operator Value 
BETWEEN 0 AND 21 
BETWEEN 21 AND 50 

Ich brauche eine Abfrage zu schreiben, die im Wesentlichen ausgeführt wird:

SELECT * FROM tbl 
WHERE 22 Operator Value 

Und Dies sollte die zweite Zeile der obigen Tabelle zurückgeben.

+1

was und alle 'Betreiber 'Werte, die Sie in dieser Frage betrachten? –

+0

@ Pratikgarg könnte es jeder SQL-Operator sein. BETWEEN, <, >, IN usw. – John

+0

So _every_ [dokumentiert Operator] (https://msdn.microsoft.com/en-us/library/ms174986.aspx) ist faires Spiel? Was wird "Value" für "EXCEPT" - und "INTERSECT" -Operatoren enthalten? Oder bitweise XOR? – HABO

Antwort

3

Sie können mit diesem gehen, versuchen Sie es mal

if object_id('tempdb..#Test') is not null drop table #Test 
create table #Test (Operator nvarchar(20), Value nvarchar(20)) 

insert into #Test (Operator, Value) 
values 
('BETWEEN', '0 AND 21'), 
('BETWEEN', '21 AND 50') 

declare @sql nvarchar(max) = 'SELECT * FROM #Test WHERE 22 ' 

declare @sqlHelper nvarchar(max) = 
       (select Operator + ' ' + Value 
         + ' and Value = '''+Value+'''' 
         from #Test 
         where 22 <= Cast(RIGHT(Value, 2) as int) and 
           22 >= Cast(LEFT(Value, 2) as int)) 

select @sql + @sqlHelper 
execute (@sql + @sqlHelper) 

rextester: http://rextester.com/OJTIW53082

Abfrage exectued ist: SELECT * FROM #Test WHERE 22 BETWEEN 21 AND 50 and Value = '21 AND 50'

Ergebnisse:

+----------+-----------+ 
| Operator | Value | 
+----------+-----------+ 
| BETWEEN | 21 AND 50 | 
+----------+-----------+ 
+0

Ich denke nicht, dass das tut, was Sie denken, dass es tut. Das gibt alle Zeilen aus der Tabelle zurück, wenn nur eine Zeile der Spalte "Wert" entspricht. Die @ sql wäre 'SELECT * FROM #test WHERE 22 ZWISCHEN 21 UND 50' – SqlZim

+0

Ändern Sie' @ sqlHelper' um: 'und value = '' '+ Value +' '' '' zu korrigieren, so: 'Wählen Sie Operator + '' + Wert + 'und Wert =' '' + Wert + '' '' von #Test wo 22 <= Besetzung (rechts (Wert, 2) als int) ' – SqlZim

+0

@SqlZim ich folge dir nicht, kannst du nehmen über diese Abfrage und fügen Sie eine weitere Antwort mit den Änderungen, die Sie gerade gesagt haben, hinzu? – Veljko89

Verwandte Themen