用于更新不同列的存储过程

时间:2017-06-08 04:28:46

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

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

如果它只是几列,我只为每个列写一个proc,但我们正在谈论100个字段,其中任何一个都可以一起更新。一张票可能只需要在此时更新时间戳,但下一张票可能是一个时间戳,谁修改了它,而下一张可能只是一张便条。

我所阅读和教过的所有内容都告诉我,动态SQL很糟糕,而如果我也有,我会写它,我更喜欢有一个过程。

3 个答案:

答案 0 :(得分:0)

你可能会有类似的事情:::

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

答案 1 :(得分:0)

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

  

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

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

答案 2 :(得分:0)

我不确定您的业务逻辑如何工作,以确定哪些列在何时更新。如果有单独的业务功能需要为每个函数更新不同但一致的列,那么您可能希望为每个函数添加单独的update语句。这将确保每个进程仅更新需要更新的列。

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

另一个选择是构建一个设置每个用户可配置字段的save proc。只要调用进程具有所有这些数据,它就可以调用保存过程并传递每个可更新列。让UPDATE MyTable SET MyCol = @MyCol在每一方都具有相同的值是没有害处的。

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

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