zoukankan      html  css  js  c++  java
  • 关于计算列

    看到网上有人使用“计算列”(computed coulumn)来强制开发人员禁止SELECT * FROM XXX这种语句的使用。以下是一个简单的例子:

    --建表
    IF OBJECT_ID(N'T35') IS NOT NULL
    BEGIN
        DROP TABLE T35;
    END;
    GO
    CREATE TABLE T35
    (
        col_1 INT,
        col_2 AS ( 1 / 0)
    )
    GO
    --插入数据
    INSERT INTO dbo.T35(col_1) VALUES(168);
    GO
    

     code-1: 创建测试表并插入数据

    --查询
    SELECT * FROM dbo.T35;
    GO

    code-2: 查询

    使用SELECT * FROM XXX语句查询,会报错:

    “Msg 8134, Level 16, State 1, Line 3

    Divide by zero error encountered.

    figure-1: 运行时报错

    而指定字段,则正常运行。

    figure-2: 指明字段,运行正常

    这种方法的确是可以实现“禁止使用*”的功能,但我个人觉得并不太建议这样做。首先,这本来就是要求开发人员自己主动避免使用*代替所有字段的这个坏习惯,而不应该要求数据库强制报错来避免。第二,如果表的字段很多,在测试或DEBUG时,造成不方便。第三,如果已经运行的系统,还要修改表结构甚至程序,不值得。第四,看到(1/0)这样的逻辑错误,即使最后不会执行,也应该尽量避免吧?如果,万一,我说的是万一……请看下估计执行计划:

    figure-3: Estimated Excution Plan

    修改一下计算列,去查看估计执行计划。

    --建表
    IF OBJECT_ID(N'T35') IS NOT NULL
    BEGIN
        DROP TABLE T35;
    END;
    GO
    CREATE TABLE T35
    (
        col_1 INT,
        col_2 AS ( col_1 / 0) --修改了这里
    )
    GO
    --插入数据
    INSERT INTO dbo.T35(col_1) VALUES(168);
    GO

    code-3: 修改表

    figure-4: Estimated Excution Plan 2

    都没有报错。为什么呢??

  • 相关阅读:
    计算闰年
    三个数比较大小
    剪刀石头布编辑
    二进制转换,八进制,十六进制转换
    原来我学的还是不够。。。
    认知是一切的基础
    spark学习笔记-java调用spark简单demo
    spark学习笔记-RDD
    Sublime Text3时间戳查看转换插件开发
    Spring Boot + Freemarker多语言国际化的实现
  • 原文地址:https://www.cnblogs.com/fishparadise/p/4913527.html
Copyright © 2011-2022 走看看