我有一个我试图阅读的API,它只给了我更新的字段。我尝试使用存储过程来更新我的表。到目前为止,我能够弄清楚如何做到这一点的唯一方法是使用动态SQL,但如果有办法不这样做,我宁愿不这样做。
如果它只是几列,我只为每个列写一个proc,但我们正在谈论100个字段,其中任何一个都可以一起更新。一张票可能只需要在此时更新时间戳,但下一张票可能是一个时间戳,谁修改了它,而下一张可能只是一张便条。
我所阅读和教过的所有内容都告诉我,动态SQL很糟糕,而如果我也有,我会写它,我更喜欢有一个过程。
答案 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服务器)在内存中具有所有必需的列。他们在每次通话时都会传递所有列。这对我们的目的来说很好。