0

我有一堆简单的表达方式,比如:

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'

有没有办法做这样的事情?我想可能避免使用动态 SQL。在我的目标设计中,表达式将存储在它们自己的表中(可在线编辑)。

4

1 回答 1

1

我一般不建议这样做,但动态 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 注入攻击。运行“通用”代码很危险。
  • 它不处理错误,这种方法很容易发生错误。
于 2020-02-26T17:03:42.907 回答