T-SQL数据类型的细微差别(二)

字符型:
字符串型支持可变长度和固定长度两种类型,最大长度是8000字节
用DECLARE关键字创建字符串变量
DECLARE @Vocolist char(20)
DECLARE @song      Varchar(30)
声明字符串变量初始值为NULL, 可用SET或SELECT来给变量赋值。
SET @Vacolis = 'paul rodgers' SELECT @song = 'ALL Right Now'
可以用"+"操作字符串,将字符串型变量或字段进行串联。
如果要存储的数据相对而言是固定长度的,并且行与行之间很少有变化,那么用固定字符型字段比较有意义。
每个可变字符型字段除存储本身数据,还要额外保存自身存储长度,如果所保存的数据长度不变,那么使用固定长度的字符字段不仅可以更有效地存储,还可以更快的存取。
固定字符变量,在串联时如果存储的长度没有达到声明的长度,会用空格来填充,这样就很有可能达不到希望的效果。可用RTRIM函数来把多余的空格删除。在默认情况下,可变字符型或Varbinary型值插入到表中时SQL Server不会删除后缀空格和零,要改变这种情况,可使用SET ANSI_PADDING或SET ANSI_DEFAULT当ANSI_PADDING为OFF时,字段值在出入表时要进行调整。
T-SQL的EXEC()函数和SP_EXECUTESQL在存储过程都可以象执行一个SQL命令一样来执行字符串变量。一般而言,SP_EXECUTESQL比EXEC更快,并且具有更多的特性,当要连续地执行多次动态产生的SQL字符串时(在运行之间只改变查询的参数),首选的工具是SP_EXECUTESQL。因为它更容易于再次使用执行计划,查询第一次执行时由查询优化器生成的,它比EXEC有效因为字符串只创建一次。并且所有参数都列在原来的数据格式中,而不是像EXEC要求的那样首选把它们转换成字符串。
SP_EXECUTESQL允许用标准的名字作为占位符在查询字符串中铅入参数,例如:
SP_EXECUTESQL N'SELECT * FROM authors WHERE au_lname LIKE @au_lname', N'@au_lname varchar(40)',@au_lname = 'GREEN%'
@au_lname 就是占位符。尽管查询会接连执行几次,但是各查询变化的只有@au_lname的值,这样就避免了查询优化器为每次执行查询重复创建执行计划。
前缀“ N”用法,他将传给存储过程的字符串定义为Unicode字符串。SP_EXECUTESQL要求传递的字符串必须是Unicode型,被执行的字符串变量nVarchar定义的原因。在某些情况下,EXEC是更好的选择,有两个原因:它不会在循环和大量重复中调用,并且它允许参数列表中有简单字符串的连接,而SQ_EXECUTESQL与所有存储过程一样不支持这种操作。
T-SQL的常用字符串类型(char, varchar , text)由特殊的单字节字符集中的字符组成,这个字符集在安装时就选定了,以后不能修改,除非重建数据或重新装载数据.Unicode字符串可以存储Unicode标准定义的所有字符,因为Unicode字符串的存储空间是常用字符串的两倍,所以字符串长度只能是常用字符串的一半。
Unicode专用的数据类型:nchar,nvarchar,ntext。T-SQL使用了字符"N"作为前缀,以区分Unicode的数据类型和值,如下:
SELECT DATALENGTH(N'The Firm')这段查询值为16,因为大写字母N将'The Firm'转成了Unicode字符串。
数值型:
T-SQL支持4种通用的数值数据类型:浮点型和实型,数据型和小数型,货币型和小货币型,整数型(int, smallint等)。
浮点型和实型为浮点数据类型能够,它们是近似值而不是精确值。
数值型和小数型为用户定义的定点数据类型,有固定的精确度,进位法和范围。
货币型和小货币型表示货币的数量相应的范围在-263-1~263-1和有四位小数的-231-1~231-1
整数类型表示所有整数,Int型需要四个字节的存储空间。能表示-231-1~231-1之间的整数,smallint型需要4个字节的存储空间能表示-215-1~215-1之间的整数。
当对SQL Server进行实型浮点数操作时,首先会发现T-SQL不能更正浮点数舍入的错误。一个极简单的解决办法是使用定点数。
除了货币类型之外的所有的数值类型在进行INSERT和UPDATE,都隐含地把字符串型转化成了相应的类型,货币必须显示转换。

以上内容是《Transact-SQL权威指南》一书的读书笔记,感谢作者KEN HENDERSON 和 译者 健莲科技 中国电力出版社 为我带来这么经典的T-SQL书籍。
posted @ 2006-12-15 20:11  斯伯内德  阅读(1261)  评论(0编辑  收藏  举报