首页 / 知识
在SQL Server上插入更新存储过程
2023-04-12 08:38:00

Insert Update stored proc on SQL Server我编写了一个存储过程,如果存在记录则会进行更新,否则它会进行插入。 它看起来像这样:
我以这种方式编写它的逻辑是更新将使用where子句执行隐式选择,如果返回0,则插入将发生。 以这种方式执行此操作的替代方法是执行select,然后根据返回的行数执行更新或插入。 我认为这是低效的,因为如果要进行更新,将导致2次选择(第一次显式选择调用,第二次隐式更新位置)。 如果proc要进行插入,那么效率没有区别。 我的逻辑是否在这里?这是如何将插入和更新组合到存储过程中的?
你的假设是正确的,这是做到这一点的最佳方式,它被称为upsert / merge。
UPSERT的重要性 - 来自sqlservercentral.com:
For every update in the case mentioned above we are removing one
The best strategy is to attempt the
编辑:
请阅读我博客上的帖子,了解您可以使用的安全模式。有很多考虑因素,这个问题的公认答案远非安全。
要快速回答,请尝试以下模式。它将在SQL 2000及更高版本上正常工作。 SQL 2005为您提供了错误处理,从而打开了其他选项,SQL 2008为您提供了MERGE命令。
如果要与SQL Server 2000/2005一起使用,则需要在事务中包含原始代码,以确保数据在并发方案中保持一致。
这将产生额外的性能成本,但将确保数据完整性。 如上所述,添加MERGE应该在可用的地方使用。 您不仅需要在事务中运行它,还需要高隔离级别。事实上,默认隔离级别是Read Commited,此代码需要Serializable。
也许添加@@错误检查和回滚可能是个好主意。 顺便说一句,MERGE是SQL Server 2008中的新功能之一。 如果您没有在SQL 2008中进行合并,则必须将其更改为: if @@ rowcount = 0和@@ error = 0 否则,如果更新由于某种原因失败,那么它将尝试之后插入,因为失败语句上的rowcount为0 UPSERT的忠实粉丝,真正减少了要管理的代码。这是我这样做的另一种方式:其中一个输入参数是ID,如果ID为NULL或0,你知道它是一个INSERT,否则它是一个更新。假设应用程序知道是否有ID,所以在所有情况下都不会工作,但如果你这样做会将执行减少一半。 修改后的Dima Malenko帖子:
您可以捕获错误并将记录发送到失败的插入表。 您的逻辑似乎很合理,但如果您传入了特定的主键,则可能需要考虑添加一些代码以防止插入。 否则,如果您在更新不影响任何记录时总是进行插入,那么当您在"UPSERT"运行之前删除记录时会发生什么?现在您尝试更新的记录不存在,因此它将创建一个记录。这可能不是你想要的行为。 |
最新内容
相关内容
python如何更新pip
python如何更新pip,培训,软件,最新,提示,版本,杀毒软件,插件,防护,上面,命令,当我们使用pip安装某个包时,在python进行pip安装插件时提示如下:Ypython怎么更新包
python怎么更新包,培训,名称,对比,工具,方式,版本,函数,以上,表格,缺点,python安装新包,pip是很好用的安装工具。piplist可以查询所有已安装的pythonupdate更新字典的方法
pythonupdate更新字典的方法,培训,字典,方法,参数,数据类型,内容,语法,实例,对象,以上,python中update更新字典的方法说明1、字典中的update(有没有人在单元测试SQL存储过程方
有没有人在单元测试SQL存储过程方面取得任何成功?,有没有人在单元测试SQL存储过程方面取得任何成功?,代码编写,单元测试,发现,过程中,H从 CSV 文件生成插入 SQL 语句
从 CSV 文件生成插入 SQL 语句,从 CSV 文件生成插入 SQL 语句,文件,工具,我一,花了,Generate insert SQL statements from a CSV fil关于sql:如何将逗号分隔的列表传递
关于sql:如何将逗号分隔的列表传递给存储过程?,关于sql:如何将逗号分隔的列表传递给存储过程?,参数,字符串,子句,列表,How to pass a com如何从代理后面更新Ruby Gems(ISA-
如何从代理后面更新Ruby Gems(ISA-NTLM),如何从代理后面更新Ruby Gems(ISA-NTLM),运行,服务器,防火墙,或其他,How do I update Ruby关于sql:MySQL中的多个更新
关于sql:MySQL中的多个更新,关于sql:MySQL中的多个更新,查询,你可以,我有,没有办法,Multiple Updates in MySQL我知道,你可以同时插入多关于ruby:如何修改.xfdl文件? (更新#
关于ruby:如何修改.xfdl文件? (更新#1),关于ruby:如何修改.xfdl文件? (更新#1),文档,文件,模板,格式化,How can I modify .xfdl files? (关于c#:自动更新版本号
关于c#:自动更新版本号,关于c#:自动更新版本号,应用程序,启用,属性,不确定,Automatically update version number我希望每个构建版本都可