【问题标题】:Stored procedure to update different columns更新不同列的存储过程
【发布时间】:2017-11-09 15:12:23
【问题描述】:

我有一个我正在尝试阅读的 API,它只为我提供了更新的字段。我正在尝试使用存储过程来更新我的表。到目前为止,我能够弄清楚如何做到这一点的唯一方法是使用动态 SQL,但如果有办法不这样做,我宁愿不这样做。

如果只是几列,我会为每个列编写一个过程,但我们谈论的是 100 个字段,其中任何一个都可以一起更新。一张票此时可能只需要更新时间戳,但下一张票可能是时间戳以及修改者,而下一张可能只是一张便条。

所有我读过和学过的东西都告诉我动态 SQL 很糟糕,如果我也有的话我会写它,但我更喜欢有一个 proc。

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-server-2008-r2


    【解决方案1】:

    你也许可以这样做:::

    IF EXISTS (SELECT * FROM NEWTABLE NOT IN (SELECT * FROM OLDTABLE))
    BEGIN
    UPDATE OLDTABLE
       SET OLDTABLE.OLDRECORDS = NEWTABLE.NEWRECORDS
       WHERE OLDTABLE.PRIMARYKEY= NEWTABLE.PRIMARYKEY
    END
    

    【讨论】:

      【解决方案2】:

      解决问题的最佳方法是使用MERGE

      根据与源表连接的结果对目标表执行插入、更新或删除操作。例如,您可以通过根据在另一个表中发现的差异在一个表中插入、更新或删除行来同步两个表。

      如您所见,您的更新可能更复杂但也更有效。使用MERGE 需要一定的熟练度,但当你开始使用它时,你会一次又一次地愉快地使用它。

      【讨论】:

        【解决方案3】:

        我不确定您的业务逻辑如何确定哪些列在什么时间更新。如果有单独的业务功能需要更新每个功能的不同但一致的列,您可能希望每个功能有单独的update 语句。这将确保每个进程只更新它需要更新的列。

        另一方面,如果您的 API 确实无法提前知道需要更新什么,那么构建动态 SQL 查询是个好主意。

        另一种选择是构建一个保存过程来设置每个用户可配置的字段。只要调用进程拥有所有这些数据,它就可以调用保存过程并传递每个可更新的列。 UPDATE MyTable SET MyCol = @MyCol 两边的值相同并没有什么坏处。

        请注意,即使所有值都相同,rowversion(或timestampcolumns)仍会更新(如果存在)。

        使用我们的软件,用户可以编辑的表格具有范围广泛的列。我们选择为每个具有所有update-able 列作为参数的表创建一个保存过程。调用进程(我们的 Web 服务器)在内存中有所有必需的列。他们在每次调用时都会传递所有列。这对我们的目的来说很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多