T-SQL编程与应用
6.1 T-SQL语言基础
6.1.1 T-SQL语言的编程功能
1. 基本功能
支持ANSI SQL-92标准:DDL数据定义,DML数据操纵,DCL数据控制,DD数据字典
2. 扩展功能
加入程序流程控制结构
加入局部变量,系统变量等
6.1.2 标识符
1. 标识符分类
常规标识符Regular identifer(严格遵守标识符格式规则)
界定标识符Delimited identifer(引号’或方括号[])
2. 标识符格式规则
SQL server 7.0以前的版本,标识符长度限制在30个字符以内。 
SQL server2000的标识符:1~128个字符;临时表名1~116个字符。
标识符的第一个字符必须是:大、小写字母、下划线、@、#。其中,@和#在TSQL中有专门的含义。
接下来的字符必须是符合Unicode2.0(统一码)标准的字母,或者是十进制数字,或是特殊字符@, #, _, $。
标识符不能与任何SQL Server保留字匹配。标识符不能包含空格,或别的特殊字符。 
*不符合规则的标识符必须加以界定(双引号””或方括号[])
注意:数据库名、表名必须符合标识符规范。
3. 对象命名规则
所有数据库对象的引用由下面四部分构成:
server_name.[database_name].[schema_name].object_name
| database_name.[schema_name].object_name
| schema_name.object_name
| object_name
说明:
server_name
指定链接的服务器名称或远程服务器名称。
database_name
如果对象驻留在 SQL Server 的本地实例中,则指定 SQL Server 数据库的名称。如果对象在链接服务器中,则 database_name 将指定 OLE DB 目录。
schema_name
如果对象在 SQL Server 数据库中,则指定包含对象的架构的名称。如果对象在链接服务器中,则 schema_name 将指定 OLE DB 架构名称。
object_name
对象的名称。
说明:从 SQL Server 2005 开始,每个对象都属于一个数据库架构。数据库架构是一个独立于数据库用户的非重复命名空间。您可以将架构视为对象的容器。可以在数据库中创建和更改架构,并且可以授予用户访问架构的权限。任何用户都可以拥有架构,并且架构所有权可以转移。
在SQL Server 2000中架构和用户是没有多大的区别,我们在2000中一般是指所有者。200
5后,用户和架构开始明确的分开,架构可以理解为对象的容器或者命名空间。2000中服务器名.数据库名.拥有者名.对象名
6.1.3 注释
1. 注释多行
/* fshjhfjkshfjsdhfsdjf
fsjdkfljskdlfjkldsfjkdslfjfjfj */
2. 注释单行
--ghjfghkfdjhgkfhgjfdhgkgjfdh
6.2 表达式
6.2.1 常量
常量是指在程序运行中值不变的量。根据常量的类型不同分为字符型常量,整型常量,日
期时间型常量、实型常量、货币常量、全局唯一标识符。
1 字符串常量
字符串常量分为ASCII字符串常量、UNICODE字符串常量。
ASCII常量:用单引号括起来,由ASCII构成的字符串。如,'abcde'
UNICODE常量:前面有一个N,如N'abcde'(N在SQL92规范中表示国际语言,必须sql语句查询结果取反大写
字符串常量必须放在单引号或双引号中。由字母、数字、下划线、特殊字符(!,@,#)组成。
当单引号括住的字符串常量中包含单引号时,用2个单引号表示字符串中的单引号。如,I'm ZYT写作'I''m ZYT'
T-SQL中设置SET QUOTED_IDENTIFIER { ON | OFF }设置。当SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。
不允许用双括号括住字符串常量因为双括号括的是标识符
SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有Transact-SQL 标识符规则。允许用双括号括住字符串常量。Microsoft SQL客户端和ODBC驱动程序自动使用ON。
说明:Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
强烈建议:用单括号括住字符串常量,别被双引号括的到底是标识符还是字符串搞糊涂。
2 整型常量
二进制整型常量,0,1组成,如111001。
十进制整型常量,如1982
十六进制整型常量,用0x开头,如0x3e,0x,只有0x表示空十六进制数。
3 日期时间型常量
用单引号将日期时间字符串扩起来。如'july 22,2007''22-july-2007'
'06-24-1983''06/24/1983''1981-05-23''19820624' '1982101'
4 实型常量
实型常量有定点和浮点。如165.234,10E23
5 货币常量
用货币符号开头。如¥542324432.25。SQL Server不强制分组,也就是每隔三个数字插一个逗号之类的。
6 全局唯一标识符
全局唯一标识符(Globally Unique Identification Numbers,GUID)是16字节长的二进制数据类型,是SQL Server根据计算机网络适配器地址和主机时钟产生的唯一号码生成的全局唯一标识符。
 例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。
6.2.2 数据类型
在 SQL Server 2005 中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。第3章已经提到。
6.2.3 变量
变量就是在程序执行过程中其值可以改变的量。
1局部变量
局部变量是作用域局限在一定范围内的T-SQL对象。
作用域:若局部变量在一个批处理、存储过程、触发器中被声明或定义,则其作用域就在批处理、存储过程或触发器内。
(1)局部变量声明
DECLARE
{
  @变量名 数据类型,@变量名 数据类型
}
注意:
变量名必须以 at (@) 开头。局部变量名必须符合有关标识符的规则。
数据类型:是系统提供的类型、CLR用户定义类型或别名数据类型。变量不能是 textntext image 数据类型。
变量先声明或定义,然后就可以在SQL命令中使用。默认初值NULL
(2)赋值
格式:SET  @变量名=表达式
格式:SELECT  @变量名=表达式/ SELECT  变量名=输出值  FROM表 where ..
说明:变量名是除cursor,text,ntext,image外的任何类型变量名;表达式是任何有效的SQLServer表达式。
SELECT  @变量名=表达式用于将单个值返回到变量中,如果表达式为列名,则返回多个。若SELECT语句返回多个值,则将返回的最后一个值赋给变量。若SELECT语句没有返回值,变量保留当前值;若表达式是不返回值的子查询,则变量为NULL。
6-1SELECT命令赋值,执行脚本
USE educ
GO
DECLARE @var1 varchar(8)      --声明局部变量
SELECT @var1='学生姓名'    --为局部变量赋初始值
SELECT @var1=Sname            --查询结果赋值给变量
FROM student
WHERE SID='bj10001'
SELECT @var1 as '学生姓名'  --显示局部变量结果
执行结果:
6-2SELECT命令赋值,多个返回值中取最后一个
USE educ
go
DECLARE @var1 varchar(8)