Вмъкнете 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 с параметри, които трябва да предам по време на Runtime. Сега искам динамично да извикам тези изрази в Stored Proc и да ги стартирам, като дам необходимите стойности. Причината, поради която се опитвам да направя това, е да го поддържам динамичен.

След като направя, всичко, което трябва да направя, е да продължа да вмъквам SQL изрази, които искам да изпълня в тази таблица, и така или иначе не трябва да променям процедурата.

РЕДАКТИРАНЕ:

Имаме работа с често променящи се SQL изрази и следователно трябва да го поставя в таблица, за да мога просто да извикам конкретен SQL израз с ID и да изпълня отново тези стойности. В зависимост от резултата от тези изявления актуализирам други стойности.


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