【问题标题】:Insert SQL statement into column and run that dynamically by calling it in a Procedure将 SQL 语句插入列并通过在过程中调用它来动态运行它
【发布时间】:2015-01-29 18:31:54
【问题描述】:

我有一个基本上有列的表:

 ID| SQL_Statement|
 1   Update Table_A Set Date=Getdate() where ID>100 and ID<200
 2   Update Table_A Set Date=@date     where ID>1 and ID<20

所以我插入了一组 SQL 语句,例如 Update/insert 具有我必须在 Runtime 期间传递的参数。现在我想将这些语句动态地调用到存储过程中,并通过提供所需的值来运行它们。 我尝试这样做的原因是为了保持动态。

一旦完成,我所要做的就是继续将我想要执行的 SQL 语句插入到此表中,并且无论如何都不必更改过程。

编辑:

我们正在处理经常更改的 SQL 语句,因此我必须将它放在一个表中,这样我就可以使用 ID 调用特定的 SQL 语句并再次运行该值。根据这些语句的结果,我会更新其他值。

【问题讨论】:

  • 用参数替换字符串中的硬编码值并调用 sp_executesql。 msdn.microsoft.com/en-us/library/ms188001.aspx 但是,请注意用户输入。
  • 这里不需要使用动态sql。只需创建一个带有两个或三个参数的过程并调用它。
  • 如果您使用这种动态 sql 方法,您可以并且应该在动态 sql 中使用参数。这对于避免 sql 注入至关重要。对我来说,存储查询以供以后运行的整个方法非常危险。
  • @SeanLange:你能告诉我这种做法的一个主要缺点吗?
  • 我可以很容易地想出一个,这段代码很难写,所以你最终会寻求帮助,因为它太复杂了。

标签: sql sql-server sql-server-2008 stored-procedures dynamic-sql


【解决方案1】:

这是一个可以执行您演示的过程的示例。

create procedure TableA_Update
(
    @Date datetime
    , @MinID int
    , @MaxID int
) as
    set nocount on

    update Table_A
    set [Date] = @Date
    where ID > @MinID
        AND ID < @MaxID 

GO

【讨论】:

  • 感谢 Sean 的回复,问题是我有一个非常频繁更改的语句,所以我必须从元数据表中选择这些语句并运行这些语句,并根据需要更改的输出其他表中的值。所以我必须尽可能保持 SQL 的动态性。
  • 将包含来自用户的参数的查询存储在数据库中以供稍后运行是充满危险的。你必须添加很多错误处理并且sql注入是非常严重的威胁,需要处理。为什么需要这样存储这些查询?
  • 嘿肖恩,谢谢你,我同意这个效果。所以基本上这些规则就像不断变化的规则,超过 50 条规则并且还在增加。我不能直接在程序中定义它。
  • 呃,这听起来真的很痛苦。您将不得不求助于动态 sql。
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多