【问题标题】:Stored procedure to update a table based on data from table parameter根据表参数中的数据更新表的存储过程
【发布时间】:2012-12-06 04:18:23
【问题描述】:

我想首先声明我是一个 SQL 菜鸟,因此在尝试解决此问题时,我将不胜感激有关我的工作流程和/或心态的任何建议或 cmet。

我正在做的是收集几个应用程序的使用统计信息,在几个类别中(并非所有类别都一定适用于所有应用程序),并将它们存储在数据库中。

我已经设置了几张表来执行此操作,然后用一张表将所有结构链接在一起(从现在开始:Dtable):

(column name - details)  
UserID  - foreign key to another table which stores users data  
ApplicationID - foreign key to another table which stores applications data  
CategoryID - foreign key to another table which holds a list of different categories  
Value - the actual data

每个应用程序都会收集数据,然后使用存储过程将其提交到数据库。由于数据量可能会根据实际使用情况(并不总是发送每个类别)和每个应用程序而有所不同,因此我正在考虑将数据作为带有 CategoryID 列表的 DataTable 发送值,因此我不必为每个单独的类别(Ptable)调用一个过程。

我需要根据CategoryIDDtable中的每条记录更新为Ptable中的正确值,同时也通过UserID过滤ApplicationIDUserIDApplicationID 将作为其他两个参数提供给存储过程。 Ptable 只包含 CategoryID / Value 记录的列表。

现在,我读到了游标(为表参数中的每条记录设置数据库表中的相关数据),但共识似乎是“不惜一切代价避免”。

那么,我将如何根据 Ptable 中的不同记录来更新表?

附言
这些表的结构是这样的,以在将来添加更多类别/应用程序时保持敏捷性和可扩展性。如果有更好的方法,我会很高兴知道。

【问题讨论】:

  • 在 Dtable 中,UserID、ApplicationID 和 CategoryID 的特定组合是否只有一个 Value?
  • @Zach Esposito:同一个 UserID 和 ApplicationID 可能有多个值,但每个 UserID AND ApplicationID AND CategoryID 只有一个值。
  • 在这种情况下,听起来您需要所有三个 ID 才能知道要更新哪个值,Ptable 是否还包含 UserID 和 ApplicationID?
  • @Zach Esposito:UserID 和 ApplicationID 将作为另外两个参数发送到存储过程,并且保持不变。我们的想法是为单个应用程序更新属于该单个用户的所有类别。

标签: sql-server tsql


【解决方案1】:

我相信更新语句看起来像这样,其中@ApplicationID@UserID 是存储过程的其他参数:

update Dtable
    set Dtable.Value = p.Value
    from Ptable p
    where Dtable.UserID = @UserID
        and Dtable.ApplicationID = @ApplicationID
        and Dtable.CategoryID = p.CategoryID;

【讨论】:

  • Fiddle(这真的很简洁,我希望我以前知道它,也谢谢你!)似乎像宣传的那样工作。 :) 谢谢@Zach Esposito!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多