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中会产生莫名奇妙的问题,所以为了代码可读性好,还是要按照规范来做的!

        
原文地址:https://www.cnblogs.com/fly_zj/p/2637011.html