Sql 通过简单的数学表达式参数化存储过程
我有一些简单的表达,比如:Sql 通过简单的数学表达式参数化存储过程,sql,sql-server,stored-procedures,expression,Sql,Sql Server,Stored Procedures,Expression,我有一些简单的表达,比如: 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_
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注入攻击。运行“通用”代码非常危险
- 它不处理错误,这种方法很容易发生错误