Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过简单的数学表达式参数化存储过程_Sql_Sql Server_Stored Procedures_Expression - Fatal编程技术网

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注入攻击。运行“通用”代码非常危险
  • 它不处理错误,这种方法很容易发生错误

您描述的内容听起来很像动态SQL的定义……您现在知道,SQL Server没有Eval()函数。这就是说,如果您不想编写动态SQL,那么您可以使用CASE语句,但您需要了解所有情况。您可以将函数作为参数传递给存储过程吗?建议您在#NET中这样做吗?使用Eval()函数?还是建议从SQL调用python脚本来执行此操作?SQL Server 2017使用sp_execute_external_脚本(SQL Server机器学习)在数据库上下文中运行python脚本?@LudovicAubert。除非你真的知道自己在做什么,否则我不建议你做这种类型的操作。在某些情况下,它可能很重要,但这不是“典型”应用程序所需要的。@LudovicAubert。对这是一个将用户输入作为SQL字符串传递的问题。验证这样的输入是相当棘手的。我在一些应用程序中使用了SQL生成。在这种情况下,代码是应用程序内部的——尽管恶意用户仍然可以更新生成代码的表中的值。