C# 动态更新存储过程SQL Server

C# 动态更新存储过程SQL Server,c#,sql,sql-server,dynamic,C#,Sql,Sql Server,Dynamic,我有一个包含30多个字段的表。许多字段允许空值。我的问题是,如果要更新更改了值的字段,如何使用存储过程更新?目前,我正在选择一个特定的行,并将所有当前值存储在表中。接下来,我必须将每个变量与新变量进行比较,看看它们是否不同,如果不同,则将该字段名和新变量添加到字符串查询中。然后执行。有没有更有效的方法?正如您所想象的,比较所有30+字段是一件痛苦的事情,尤其是因为其中许多字段是可为空的。多谢各位 以下是我存储过程中的逻辑: 拥有所有可为null的参数并将其设置为null(因为它是可选的) 为我将

我有一个包含30多个字段的表。许多字段允许空值。我的问题是,如果要更新更改了值的字段,如何使用存储过程更新?目前,我正在选择一个特定的行,并将所有当前值存储在表中。接下来,我必须将每个变量与新变量进行比较,看看它们是否不同,如果不同,则将该字段名和新变量添加到字符串查询中。然后执行。有没有更有效的方法?正如您所想象的,比较所有30+字段是一件痛苦的事情,尤其是因为其中许多字段是可为空的。多谢各位

以下是我存储过程中的逻辑:

  • 拥有所有可为null的参数并将其设置为null(因为它是可选的)
  • 为我将要测试的每个字段声明一个变量(30多个字段)
  • 选择通过参数(主键)传入的ID标识的行
  • 将所有值存储到每个变量中
  • 检查每个值是否为空。如果是,这意味着用户没有提供该字段,因此不需要对该字段进行更新。如果参数值不为NULL,请检查它是否等于从数据库中选择的值。如果值为!=,然后将其添加到要更新的查询字符串中
  • 执行更新查询字符串

  • 为什么需要在更新之前比较字段?@ChrisLively,因为我想检查是否存在受影响行的真实更新。因为我将有一个表来存储旧值。如果行影响>0,我将在另一个表中插入所有旧值以保留历史记录。因此,我必须在更新之前进行检查,因为据我所知,即使更新的值相同,更新查询也会影响行。一般来说,存储旧值的表的所有列都与原始表相同(加上一列表示发起更改的人和日期/时间字段)。它们通常由运行update语句时发生的触发器填充,这使得确定是否发生记录更新变得很简单。我仍然不明白为什么需要比较所有的值并使用动态sql。但是我不知道这些值是否真的发生了变化,除非我在更新之前进行比较,结果是否正确?我不想存储未更改的值,因为如果我运行更新查询,则无论值是否与以前相同,影响行都将为1。此外,如果更改了这些行(可能每5秒检查一行),那么如果我不断插入和更新值,当它们没有真正更改时,我不会发现将数千行作为我的“旧值”是有效的,也不会达到目的。update语句不必关心它。在触发器中,您可以轻松地比较新旧行状态,以查看列是否已更改,并可以选择将新内容插入历史记录表。