zoukankan      html  css  js  c++  java
  • TSQL糟糕的编码规范

    作为一名DBA,不免要与形形色色的TSQL代码打交道,看以下的三例:

    1:distinct 中乱用括号:

    SELECT DISTINCT (TransactionID),ProductID,TransactionType
    FROM adventureworks.Production.TransactionHistoryArchive

    与下面这句结果是一模一样,但上面这句可能使人迷糊,到底是 TransactionID去掉重复项,还是整个所有的列合在一起,去掉重复项呢!  规范的写法如下:

    SELECT DISTINCT TransactionID,ProductID,TransactionType
    FROM adventureworks.Production.TransactionHistoryArchive
     
     

    2:许多代码中定义字段,没有规定长度,先来看看表的定义:

    CREATE TABLE tab1 (col1 VARCHAR )
    
    INSERT INTO tab1 SELECT 'english'

    代码报错,没有插入成功!

    Msg 8152, Level 16, State 14, Line 1
    String or binary data would be truncated.
    The statement has been terminated.

    再来插入单个字符:

    INSERT INTO tab1 SELECT 'e'

    OK,说明定义表中没有规定长度,默认为1

    另外一种常见的情况是在使用cast,convert函数转换中:

    DECLARE @y varchar(100)='This article explains the different technologies that are available for scaling out'
    
    SELECT len(@y),len(cast(@y AS VARCHAR ))
     

    可以看看结果

    image

    默认的值是30个字符!所以为了代码的清晰可读,还是要带上长度

    3:在应该使用nvarchar的地方,也还是使用varchar

    DECLARE @name1 varchar(10)='中'
    DECLARE @name2 nvarchar(10)='中'
    SELECT datalength(@name1),DATALENGTH(@name2)
    image 
     

    可以看到这两者使用的字节数是一样的,而使用varchar(10)='中' 这个方式在SSIS中会产生莫名奇妙的问题,所以为了代码可读性好,还是要按照规范来做的!

            
  • 相关阅读:
    Vue ui创建vue-cli 3.0项目
    Vue中封装axios
    微信小程序自定义顶部导航
    linux离线安装docker
    解决websocket不能@Autowired注入问题
    springboot 连接 Access数据库
    Flex 布局教程:语法篇
    通过代码来了解下java策略模式,消除if-else
    docker下安装FastDFS
    centos7下安装docker
  • 原文地址:https://www.cnblogs.com/fly_zj/p/2637011.html
Copyright © 2011-2022 走看看