2017-02-22 20 views
-1

мне нужно динамически создавать SQL, у меня есть таблица вроде этого:Dynamic SQL на основе значений в таблице

Operator Value 
BETWEEN 0 AND 21 
BETWEEN 21 AND 50 

Мне нужно написать запрос, который будет в основном выполнять:

SELECT * FROM tbl 
WHERE 22 Operator Value 

И это должно вернуть вторую строку таблицы выше.

+1

, что и все 'оператора 'значения, которые вы рассматриваете в этом вопросе ?? –

+0

@pratikgarg это может быть любой оператор SQL. МЕЖДУ, <, > В и т.д. – John

+0

Так _every_ [задокументированы оператор] (https://msdn.microsoft.com/en-us/library/ms174986.aspx) является честной игры? Что будет содержать 'Value' для операторов' EXCEPT' и 'INTERSECT'? Или побитовое XOR? – HABO

ответ

3

Вы можете пойти с этим, дайте ему попробовать

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

exectued запрос: SELECT * FROM #Test WHERE 22 BETWEEN 21 AND 50 and Value = '21 AND 50'

результаты:

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

Я не думаю, что это делает то, что вы думаете. Это возвращает все строки из таблицы, если даже одна строка соответствует столбцу 'value'. @sql будет 'SELECT * FROM #test WHERE 22 BETWEEN 21 AND 50' – SqlZim

+0

изменить' @ sqlHelper', чтобы включить: 'и value = '' '+ Value +' '' '' для исправления, например: 'select Operator + '' + Value + 'и Value =' '' + Value + '' '' из #Test, где 22 <= cast (right (Value, 2) as int) ' – SqlZim

+0

@SqlZim Я не буду следовать за вами, можете ли вы принять по этому запросу и добавить еще один ответ с изменениями, которые вы только что сказали? – Veljko89