有没有一种方法可以更新表上的列的任何组合?

时间:2019-04-05 19:34:53

标签: c# sql-server tsql

是否有一种有效的方法来更新表中列的任何组合?

例如,如果您使用下面的| EmployeeId | EmployeeName | TeamName | Title | ReportingManager | Salary |表。我给出了一些可能在此表上发生的示例更新。随着表大小的增加,唯一更新条件的潜在数量也会增加。

Title

使用上表的一些功能示例:

  • 已晋升员工:更新SalaryTeamName
  • 在同一报表管理员下的员工变更团队:更新TeamName
  • 不同报告管理者下的员工变更团队:更新ReportingManagerReportingManager
  • 员工获得新的报告管理员:更新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 对象的方法来实现此目的?

2 个答案:

答案 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;

但是,您可能缺少重要的东西。为了跟踪这些更改并使信息可靠,您需要一个附加表来跟踪所有更改。想象一下,一个经理取得了出色的成绩,因此他被调往一个表现不佳的知名团队。此后,有人查看了团队的结果,并向该经理显示由于他的新团队而导致的糟糕结果。最终导致经理被解雇或失去奖金。

您需要确保您的数据库可以显示准确的历史记录并且信息可靠。捷径无法实现。为每个事件创建一个新的过程,但更重要的是,请人来正确设计数据库。