通过一个简单的数学表达式将存储过程参数化



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

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。在我的目标设计中,表达式将存储在它们自己的表中(可在线编辑(。

我通常不建议这样做,但动态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注入攻击。运行"通用"代码是非常危险的
  • 它不处理使用此方法很容易发生的错误

最新更新