Вставьте оператор SQL в столбец и запустите его динамически, вызвав его в процедуре

У меня есть таблица, в которой в основном есть столбцы:

 ID| SQL_Statement|
 1   Update Table_A Set Date=Getdate() where ID>100 and ID<200
 2   Update Table_A Set Date=@date     where ID>1 and ID<20

Поэтому я вставляю набор операторов SQL, таких как Update / insert, с параметрами, которые я должен передать во время выполнения. Теперь я хочу динамически вызывать эти операторы в Stored Proc и запускать их, задавая требуемые значения. Причина, по которой я пытаюсь это сделать, - сохранить динамику.

После этого все, что мне нужно сделать, это продолжать вставлять операторы SQL, которые я хочу выполнить, в эту таблицу, и мне в любом случае не нужно изменять процедуру.

РЕДАКТИРОВАТЬ:

Мы имеем дело с часто меняющимися операторами SQL, и поэтому я должен поместить его в таблицу, чтобы я мог просто вызвать конкретный оператор SQL с идентификатором и снова запустить его значения. В зависимости от результата этих утверждений я обновляю другие значения.


person snp.it    schedule 29.01.2015    source источник
comment
Замените жестко запрограммированные значения в строках параметрами и вызовите процедуру sp_executesql. msdn.microsoft.com/en-us/library/ms188001.aspx Однако остерегайтесь пользовательского ввода.   -  person Mansfield    schedule 29.01.2015
comment
Здесь вам не нужно использовать динамический sql. Просто создайте процедуру с двумя или тремя параметрами и вызовите ее.   -  person Sean Lange    schedule 29.01.2015
comment
Если вы используете этот динамический подход sql, вы можете и должны использовать параметры с вашим динамическим sql. Это очень важно, чтобы избежать внедрения sql. Для меня весь этот подход к хранению запросов для последующего выполнения невероятно опасен.   -  person Sean Lange    schedule 30.01.2015
comment
@SeanLange: Можете ли вы назвать мне один серьезный недостаток такой практики?   -  person snp.it    schedule 03.02.2015
comment
Я могу довольно легко придумать один, этот код сложно написать, поэтому вы в конечном итоге просите о помощи, потому что он слишком сложен.   -  person Sean Lange    schedule 03.02.2015
comment
И что еще хуже, вам нужно быть осторожным с внедрением sql. Чтобы обезопасить этот тип процедуры от инъекций, а также справиться с обычными исключениями, потребуется немало усилий.   -  person Sean Lange    schedule 03.02.2015
comment
возможный дубликат Как выполнять операторы SQL сохраняется в таблице с T-SQL   -  person DeanOC    schedule 15.04.2015


Ответы (1)


Вот пример процедуры, которая могла бы делать то, что вы продемонстрировали.

create procedure TableA_Update
(
    @Date datetime
    , @MinID int
    , @MaxID int
) as
    set nocount on

    update Table_A
    set [Date] = @Date
    where ID > @MinID
        AND ID < @MaxID 

GO
person Sean Lange    schedule 29.01.2015
comment
Спасибо за ответ, Шон, дело в том, что у меня очень часто меняются операторы, поэтому мне придется выбирать эти операторы из таблицы метаданных и запускать операторы, и в зависимости от вывода необходимо изменить значения в других таблицах. Так что мне придется сделать SQL как можно более динамичным. - person snp.it; 30.01.2015
comment
Хранение запросов в вашей базе данных для последующего запуска, которые будут включать параметры от пользователя, чревато опасностями. Вы должны добавить много обработки ошибок, а внедрение sql - очень серьезная угроза, с которой нужно бороться. Зачем вам нужно хранить эти запросы в таком виде? - person Sean Lange; 30.01.2015
comment
Привет, Шон, Спасибо, и я согласен с последствиями этого. Таким образом, в основном это как правила, которые постоянно меняются, и это более 50 правил и их количество. Я не могу напрямую определить это в процедуре. - person snp.it; 30.01.2015
comment
Ух, это звучит как настоящая боль. Вам придется прибегнуть к динамическому sql. - person Sean Lange; 30.01.2015