параметризовать хранимую процедуру простым математическим выражением - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть несколько простых выражений, таких как:

c=a+b
c=a*b
...

Я хотел бы передать их в качестве параметра хранимой процедуре, которая собирается выполнить обновление с использованием их.

CREATE TABLE t(
    a int,
    b int,
    c int
);

INSERT INTO t VALUES (1,2,3),(4,5,6);

CREATE PROCEDURE sp @left_member varchar(50), @right_member
AS 
BEGIN
    UPDATE t
    SET @left_member = @right_member
END

EXEC sp  'c', 'a+b'
EXEC sp  'c', 'a*b'

Есть ли способ сделать что-то подобное? Я хотел бы, возможно, избежать Dynami c SQL. В моем целевом дизайне выражения будут храниться в их собственной таблице (редактируемой онлайн).

1 Ответ

1 голос
/ 26 февраля 2020

Я обычно не рекомендую делать это, но Dynami c SQL в значительной степени является решением:

CREATE PROCEDURE usp_exec_dangerous_update (
    @left_member nvarchar(50),
    @right_member nvarchar(50)
)
AS 
BEGIN
    DECLARE @sql NVARCHAR(MAX);

    SET @sql = N'
UPDATE t
    SET [left_member] = [right_member]
';

    SET @sql = REPLACE(REPLACE(@sql, '[left_member]', @left_member), '[right_member]', @right_member);

    EXEC sp_executesql @sql;
END;

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

  • . Подвержены системе SQL инъекционным атакам. Запуск кода «generi c» просто опасен.
  • Он не обрабатывает ошибки, которые легко возникают при использовании этого метода.
...