AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 2940
Accepted
kacalapy
kacalapy
Asked: 2011-05-26 07:16:01 +0800 CST2011-05-26 07:16:01 +0800 CST 2011-05-26 07:16:01 +0800 CST

更新传递给 proc 的存储 proc 字段,让其他人不理会

  • 772

我有一个执行简单更新的存储过程(见下文)。

我只想更新传递的字段,而不是那些为空的字段。也就是说,如果我没有得到某个参数的值,我不想将表数据更新为 null,而只是保留当前值。

这可以在这样的 sql update 语句中完成吗?

ALTER PROCEDURE [dbo].[upd_MessageDetail]  
    @MessageId INT,  
    @IsDraft INT,  
    @IsPreviewed INT,  
    @IsRead INT,  
    @IsFlagged INT,  
    @IsDeleted INT,  
    @IsArchived INT    
AS  
BEGIN  


        UPDATE MessageDetail   
        SET 
            IsDraft = @IsDraft,  
            IsPreviewed = @IsPreviewed,  
            IsRead = @IsRead,  
            IsFlagged = @IsFlagged,  
            IsDeleted = @IsDeleted,  
            IsArchived = @IsArchived   
        WHERE MessageId = @MessageId
sql-server-2005 stored-procedures
  • 2 2 个回答
  • 2472 Views

2 个回答

  • Voted
  1. Best Answer
    Sankar Reddy
    2011-05-26T07:34:19+08:002011-05-26T07:34:19+08:00

    如果我理解正确,如下所示。

    UPDATE MessageDetail   
            SET 
                IsDraft = ISNULL (@IsDraft, IsDraft), 
                IsPreviewed = ISNULL (@IsPreviewed,  IsPreviewed),
                IsRead = ISNULL (@IsRead, IsRead), 
                IsFlagged = ISNULL (@IsFlagged, IsFlagged), 
                IsDeleted = ISNULL(@IsDeleted, IsDeleted)
                IsArchived = ISNULL(@IsArchived, IsArchived)
            WHERE MessageId = @MessageId
    
    • 10
  2. Andrew Bickerton
    2011-06-08T00:58:53+08:002011-06-08T00:58:53+08:00

    Sankar Reddy的答案的附录是,如果您使用复制或使用检查列是否已更新的触发器(使用Update()函数),那么创建一个复杂的 IF .. ELSE 语句以不包括UPDATE 语句中的字段。

    具体来自MSDN 文章

    检测实际列更新
    UPDATE() 检测列是否是 UPDATE (INSERT) 语句的一部分。它不检测该语句是否更改了值。这也适用于 COLUMNS_UPDATED() 函数。

    选项:

    1. 复杂的IF .. ELSE 语句
      检查所有可能的更新组合(这样您只需使用最少的网络带宽对数据库进行一次更新调用)
      • 好:减少通过线路/发送到表的数据(对于高度复制的表很有用)
      • 好:您可以使用 UPDATE() 函数来检查值是否已更改...
      • 坏:随着表上列数的增加呈指数复杂性(即:2 列表需要 3 次检查,两列是否都在更新?第 1 列是否更新?第 2 列是否更新?添加第 3 列会将其增加到 8 次检查)
    2. 简化的 IF .. ELSE 语句
      通过单独更新每一列来允许多次更新调用...
      • 好:存储过程中的简化 sql(更易于维护/不易出错)
      • 不好:更新不是原子的
      • 不好:随着对 db 的调用越来越多,IO 流量增加
    3. 字符串解析
      将更新语句解析为一个大字符串,然后执行它
      • 好:简化的 IF .. ELSE 与数据库上的 1 个更新调用相结合
      • bad:SQL注入的潜在安全风险(可以通过使用参数来最小化)
      • 不好:因为 sql 语句被解析而不是编译,所以 CPU 开销很小(尽管我认为这并不比上面的其他 2 个选项差)

    推荐

    1. Sankar Reddy的答案 - 它是最简单的编码/维护并且很好理解
    2. 如果性能(IO/网络)确实是一个问题,那么作为最后的手段进行字符串解析(有比这更容易的性能提升!)......
    • 1

相关问题

  • 有人在实践中使用过 sqlcmd 模式吗?[关闭]

  • 是否有人使用 SQL Server 功能来创建按编号区分的存储过程组?

  • 如何在不安装新实例的情况下更改 MS SQL 2005 中的实例名称?

  • MySQL 存储例程中的动态 SQL

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve