作为一名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 ))
可以看看结果
默认的值是30个字符!所以为了代码的清晰可读,还是要带上长度
3:在应该使用nvarchar的地方,也还是使用varchar
DECLARE @name1 varchar(10)='中' DECLARE @name2 nvarchar(10)='中' SELECT datalength(@name1),DATALENGTH(@name2)
可以看到这两者使用的字节数是一样的,而使用varchar(10)='中' 这个方式在SSIS中会产生莫名奇妙的问题,所以为了代码可读性好,还是要按照规范来做的!