2014-08-29 8 views
0

Моя база данных состоит из двух таблиц: t_computers и t_queries.Использование запроса, хранящегося в таблице

Этот запрос показывает мне, какие компьютеры ноутбуки

select * 
from t_computers 
where type = 'Laptop' 

В таблице t_queries я хранящегося динамических запросов SQL.

SELECT QuerySQL 
from t_query 
where QueryName = 'Clients that have not been started in 30 days' 

Первый результат - это запрос SQL, который дал бы мне эту информацию.

Теперь для сложной части я хочу только выбрать компьютеры с типом «Ноутбук» и возвращаться, если я запустил запрос, который хранится в таблице.

Так что-то вроде этого

select * 
from t_computers 
where type = 'Laptop' and 
     (computer is returned for (SELECT QuerySQL 
           from query 
           where QueryName = 'Clients that have not been started in 30 days')) 

даже возможно ли это? Я использую SQL Server 2008 R2

Я использовал очень упрощенный пример. Некоторая справочная информация о том, почему я хочу использовать запрос, сохраненный в таблице. Благодаря нашей системе управления клиентами (аналогичной SCCM) администраторы могут легко создавать «представления» клиентов. Например, отфильтруйте все компьютеры, у которых есть IP, начиная с 10. *. Как только они сохраняют представление, SQL-запрос создается и сохраняется в таблице t_queries. Этот один запрос, который я хочу сравнить с изменениями довольно часто.

+0

Какой СУБД является вы используете? – Barranka

+1

Выполнение sql, хранящееся в db, для меня совсем не похоже – ControlAltDel

+0

с использованием MS SQL @Barranka –

ответ

1

Да, это возможно, но, как заявили комментаторы, я настоятельно рекомендую вам выполнить произвольный код, исходящий от ваших пользователей, независимо от того, насколько вы им доверяете. У вас будет очень мало возможностей для обеспечения соблюдения правил безопасности и может открыть себя для разрушительных нарушений безопасности.

Способ, которым это правильно сделано в других системах, заключается в использовании определенного языка запросов (пользовательский или нет), который вы интерпретируете, и «переводить» на SQL, если необходимо. Это позволяет вам ограничить возможные операции тем, что строго необходимо.

После этого оговорки, вот ответ на вопрос (не проверялось, у меня нет SQL Server на этом ноутбуке, так что я, возможно, перепутался немного с кавычками):

exec('select * 
from t_computers 
where type = ''Laptop'' and 
     (computer is returned for ('+SELECT TOP(1) QuerySQL 
           from query 
           where QueryName = 'Clients that have not been started in 30 days'+'))'); 
Смежные вопросы