zoukankan      html  css  js  c++  java
  • 【SQLSERVER学习笔记】进攻式编程

    一般的编程语言建议是进行防御式编程,在开始处理之前先检查所有参数的合法性。
    但实际上,对数据库编程而言,尽量同时做几件事情的进攻式编程有切实的优势。
    */

    --我们SP中常见的防御式编程示例:
    --场景一:判断数据是否存在

    注:C为一个不可空字段

    IF NOT EXISTS(
        SELECT TOP (1) 1
        FROM A WITH(NOLOCK)
        WHERE ID = @ID
    )
    BEGIN
        SET @Response = 'E' 
        GOTO ErrorHandle
    END
    
    SELECT TOP (1) @B = C
    FROM A WITH(NOLOCK)
    WHERE Id= @ID

    修改如下:

    SELECT TOP (1) @B= C
    FROM dbo.A WITH(NOLOCK)
    WHERE Id= @Id
    
    IF @B IS NULL
    BEGIN
        SET @Response = 'E' 
        GOTO ErrorHandle
    END

    这种情形下,C是非空字段,那么就可以直接去它来判断这个Item是否存在,这样就减少一次A表的查询

    --场景二:当数据存在时更新,不存在时插入
    
    IF EXISTS(
        SELECT TOP 1 1 
        FROM dbo.A WITH(NOLOCK)
        WHERE 字段2= 1583)
    BEGIN
        UPDATE TOP(1) dbo.A
        SET 字段1= 'ccc'
        WHERE 字段2= 2123
    END
    ELSE
    BEGIN
        INSERT INTO dbo.A
        ( 
            字段1,
            字段2
        )
        VALUES
        (
            aaa,
            'ccc'
        )
    END
    
    /*
    分析:
    这种使用select去判断存在性是不建议的
    我们可以直接通过where条件去update,当update所影响的行数等于0时,就说明该数据不存在,这时再insert
    修改如下:
    */
    
    UPDATE TOP(1) dbo.A
    SET 字段1= 'aaa'
    WHERE 字段2 = 123
    
    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO dbo.A
        ( 
            字段1,
            字段2
        )
        VALUES
        (
            aaa,
            'ccc'
        )
    END
    
    /*
    总结:
    以合理的可能性为基础。
    以概论为基础进行编程。
    假设最可能的结果。
    不是的确必要,不要采用异常捕捉的处理方式。
    */    
  • 相关阅读:
    centos7 tar.gz zip 解压命令[转]
    centos7 下 安装visual studio code ,打开运行。
    yum提示Another app is currently holding the yum lock; waiting for it to exit...
    Linux CentOS7 安装
    虚拟机 centos7 的网络与电脑所在一个网络如何设置
    django创建web项目
    uwsgi Flask web.py
    MariaDB 与 MySQL 区别
    python pymysql 与 mysqlclient
    如何提高自己的象棋水平及象棋开局的五种忌讳
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/5058743.html
Copyright © 2011-2022 走看看