Stored procedures 更新记录的存储过程:如何处理未更改的值

Stored procedures 更新记录的存储过程:如何处理未更改的值,stored-procedures,parameters,data-access-layer,Stored Procedures,Parameters,Data Access Layer,我正在从我的DAL调用更新存储过程,全部传入!表的字段作为参数。最大的一张桌子总共有78张。 我传递所有这些参数,即使可能只有一个值改变 这对我来说似乎相当低效,我想知道,如何做得更好 我可以将所有参数定义为可选的,并且只传递更改的参数,但是我的DAL不知道哪些值更改了,因为我只是将模型对象传递给它 我可以在更新之前对表进行选择,并比较这些值,以找出哪些值发生了更改,但这可能也会带来很大的开销 我被困在这里了。。。我很感兴趣你对这件事的看法 编辑:忘了提到:我使用的是C速成版,SQL 2008也

我正在从我的DAL调用更新存储过程,全部传入!表的字段作为参数。最大的一张桌子总共有78张。 我传递所有这些参数,即使可能只有一个值改变

这对我来说似乎相当低效,我想知道,如何做得更好

我可以将所有参数定义为可选的,并且只传递更改的参数,但是我的DAL不知道哪些值更改了,因为我只是将模型对象传递给它

我可以在更新之前对表进行选择,并比较这些值,以找出哪些值发生了更改,但这可能也会带来很大的开销

我被困在这里了。。。我很感兴趣你对这件事的看法

编辑:忘了提到:我使用的是C速成版,SQL 2008也是速成版。我用这篇文章写的DAL。
这可能不是自2006年以来最新的最先进的方式,也就是说Linq之前的方式,但是Linq只适用于Express中的本地SQL实例,但我的主要目标是学习C,因此,我想这还不算太糟糕。

如果您可以更改DAL而不放弃更改,那么在进行更改时从新模式重新生成层,我建议传递一个结构,其中包含更改的列和值,以及一个包含关键列和更新值的结构

这可以使用哈希表来完成,如果模式已知,那么在新的update函数中操作它应该相当容易

如果这是一个自动化的DAL,那么使用DAL会有一些缺点,您可以在模型对象中实现日志更改跟踪。这样,您可以通过每次设置新值时保存属性的上一个值来跟踪对象中的任何更改。此信息可以通过以下两种方式之一存储:

作为每个对象自身私有状态的一部分 集中在经理班。 在第一种解决方案中,您可以在基类中轻松实现此功能,并通过继承在所有模型对象中运行


在第二种解决方案中,您需要创建某种容器类,该类将保留对已创建的任何模型对象的引用和唯一标识符,并在中央存储中记录其状态的所有更改。这类似于许多ORM对象关系映射框架实现此类功能的方式。

有现成的ORM支持这类场景比较好。编写自己的ORM将使您没有许多这样的特性

我找到了对象。保存模式导致了这种行为,但我个人不是对象的粉丝,你没有理由遵循这种模式。保存,我觉得我是少数

您的数据层可以通过多种方式了解更改的内容,其中大多数都由现成的ORMs支持。您还可以潜在地使UI和/或业务层足够智能,以便将这些知识传递到数据层

我更喜欢两种选择:

生成/手动编码更新 只接受 易于更改的参数。 生成更新语句 完全在飞行中。
您正在使用哪些语言?我很好奇您将如何编写存储过程来处理修改列的变量集。您要动态生成update语句吗?我会这样做:创建过程UpdateSomething@something varchar50=null作为BEGIN BEGIN TRANSACTION IF@something NOT null update tblTest SET something='foo'COMMIT END dunno如果这不好,这就是为什么我要问的原因