是否有一种有效的方法来更新表中列的任何组合?
例如,如果您使用下面的| EmployeeId | EmployeeName | TeamName | Title | ReportingManager | Salary |
表。我给出了一些可能在此表上发生的示例更新。随着表大小的增加,唯一更新条件的潜在数量也会增加。
Title
使用上表的一些功能示例:
Salary
和TeamName
TeamName
ReportingManager
和ReportingManager
EmployeeName
| ColumnName | WasValueChanged | Value |
| EmployeeName | 0 | NULL |
| TeamName | 1 | Team B |
| Title | 0 | NULL |
| ReportingManager | 1 | John Smith |
| Salary | 0 | NULL |
我听说过使用TVP列出的表格中的每一列。 TVP还具有位标志,以指示所讨论的列已更改,然后还有一个值字段,其中包含用于更新列的新值。像这样:
Employee
这可以完成工作,但它似乎不是最干净的解决方案。在C#中保存和检索数据时,是否有一种无需使用DataTable或不传递整个MP|3560039|||L000011396|BTA171|30071: PHILLIPS, MT|4253|I|103278|||D|1
MP|3561042|||WQTI544|BEA148|16023: BUTTE, ID|2891|I|103306|||D|1
MP|3561042|||WQTI544|BEA148|16077: POWER, ID|7817|I|103306|||D|1
MP|3561042|||WQTI544|BEA148|16011: BINGHAM, ID|45607|I|103306|||D|1
MP|3561042|||WQTI544|BEA148|16005: BANNOCK, ID|82839|I|103306|||D|1
MP|3561250|||WQTI576
|BEA135|48301: LOVING, TX|82|I|103308|||D|1
MP|3561250|||WQTI576
|BEA135|48443: TERRELL, TX|984|I|103308|||D|1
MP|3561250|||WQTI576
|BEA135|48173: GLASSCOCK, TX|1226|I|103308|||D|1
MP|3561250|||WQTI576
|BEA135|48243: JEFF DAVIS, TX|2342|I|103308|||D|1
MP|3561250|||WQTI576
|BEA135|48461: UPTON, TX|3355|I|103308|||D|1
MP|3561250|||WQTI576
|BEA135|48383: REAGAN, TX|3367|I|103308|||D|1
对象的方法来实现此目的?
答案 0 :(得分:1)
在我看来,使用表值参数是一个不错的解决方案。您需要以某种方式告诉过程要更新哪些列及其值。如果字段不可为空,则一种选择是:
create procedure employee_update
@title nvarchar(100) =null,
@teamName nvarchar(100)=null
as
update employee
set title=case when(@title is null) then title else @title end,
teamname=case when (@teamname is null) then teamname else @teamname end
另一种选择是将数据作为JSON或XML之类的blob传入,那么您可以执行相同的逻辑;但是,我仍然认为TVP更干净
答案 1 :(得分:1)
您可以每次简单地更新所有列。当数据不变时,只需使用相同的值进行更新。
CREATE PROCEDURE UpdateEmployee(
@EmployeeId int,
@EmployeeName varchar(250),
@TeamName varchar(250),
@Title varchar(250),
@ReportingManager int,
@Salary decimal(18,4)
)
UPDATE Employees SET
EmployeeName = ISNULL( @EmployeeName , EmployeeName ),
TeamName = ISNULL( @TeamName , TeamName ),
Title = ISNULL( @Title , Title ),
ReportingManager = ISNULL( @ReportingManager, ReportingManager),
Salary = ISNULL( @Salary , Salary )
WHERE EmployeeId = @EmployeeId;
但是,您可能缺少重要的东西。为了跟踪这些更改并使信息可靠,您需要一个附加表来跟踪所有更改。想象一下,一个经理取得了出色的成绩,因此他被调往一个表现不佳的知名团队。此后,有人查看了团队的结果,并向该经理显示由于他的新团队而导致的糟糕结果。最终导致经理被解雇或失去奖金。
您需要确保您的数据库可以显示准确的历史记录并且信息可靠。捷径无法实现。为每个事件创建一个新的过程,但更重要的是,请人来正确设计数据库。