【问题标题】: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 服务器)在内存中有所有必需的列。他们在每次调用时都会传递所有列。这对我们的目的来说很好。