现在位置： 首页 -> 网站开发 -> 数据库技术

#### Transact-SQL语法元素

- 文章来源：微尔IT　作者:光骑士 更新时间：2009-1-11　推荐等级： 热 荐查看次数：
  大 中 小
- 关 键 字：Transact-SQL语法元素
- 推荐给QQ/MSN好友：
- 页面收藏到：

## 1.3 Transact-SQL语法元素

DML语句包含了很多Transact-SQL的语法元素。其中包括批处理命令（Batch directives ）、注释语句（Comments ）、标识符（Identifiers ）、数据类型、变量（Variables ）、系统函数、运算符、表达式、流控制语句和保留的关键字。

### 1.3.1 批处理命令

SQL Server能以批处理的方式处理单个或多个Transact-SQL语句。一个批处理命令指示SQL Server分析并运行一个批处理内的所有指令。有两种指示SQL Server运行批处理的方法。
GO
对SQL Server来说 GO是作为向SQL Server发出Transact-SQL批处理语句的一种信号。GO命令告诉SQL Server 使用Transact-SQL执行批处理和结束批处理，它实际上并不是Transact-SQL语句。
使用GO命令时，注意以下情况：
当前的批处理语句包含上一个GO语句后输入的所有语句或从ad hoc 会话开始的语句（或者脚本，如果这是第一个GO）。
尽管一行中可以包含注释语句，但Transact-SQL语句不能和GO语句同处一行。
在批处理中，用户必须遵守一定的规则,例如，某些数据定义语句必须和其他的Transact-SQL语句分开执行，此时通过GO命令来隔离这些语句。
局部变量(用户定义的)的作用范围局限于一个批处理内部，在GO命令后，就不能再使用这个变量了。
注意：GO实际上并不是Transact-SQL语句，它只是用于声明一个批处理。

### 1.3.2 EXEC

EXEC命令用于执行用户定义的函数、系统存储过程、用户自定义的存储过程或扩展存储过程。在一个Transact-SQL批处理内部，它也能控制一个字符串的运行。使用EXEC时，可以传递参数并返回运行后的结果。

### 1.3.3 注释语句

注释语句是不可执行的语句，你可以把它放在其他SQL语句中作为注释，或在测试时使一些语句无效。注释语句有两种用法：一种是嵌于行内的注释语句，另一种是整块注释。
1、嵌于行内的注释语句
在某一行内用两个联字符(--)创建注释语句，把正式语句和注释语句分开。Transact-SQL将把出现在这个符号后的所有字符视为注释语句。这个注释语句符号可以使某一行语句无效（多在测试时使用）。
下面的例子使用嵌于行内的注释语句来解释正在进行的计算。
USE northwind
SELECT productname
，(unitsinstock - unitsonorder) -- Calculates inventory
，supplierid
FROM products
GO
下面的例子使用嵌于行内的注释语句来避免运行某一段语句。
USE northwind
SELECT productname
， (unitsinstock - unitsonorder) -- Calculates inventory
-- ， supplierid
FROM products
GO
2、块注释语句
在注释语句的开始处输入(/*)，在注释语句的结束处输入(*/)，就可以把这两个符号间的所有字符变成注释语句，从而创建包含多行的块注释语句。
使用块注释语句符能够创建一行或多行的注释语句，或者在脚本语句头部创建注释语句标题，这种标题用于解释后面的SQL语句的作用。块注释语句标题通常包含作者姓名、创建日期和最后一次修改的日期、版本信息，并解释下面的语句所作的工作。
下面的例子显示了一个注释语句标题的用法，这个标题跨越了多行。
／*
This code retrieves all rows of the products table
and displays the unit price，the unit price increased by 10 percent，
and the name of the product．
*／
USE northwind
SELECT unitprice， (unitprice * 1.1)，productname FROM products
GO
注意： 应当尽可能多地在SQL脚本中使用注释语句，它们能够描述你的语句所作的工作。在别人需要察看或修改你的脚本时，注释语句显得尤为重要。
下面的例子中，通过使用块注释语句符来避免某段语句的运行。在调试或修改脚本文件时，往往有用。
/*
DECLARE @v1 int
SET @v1=0
WHILE @v1<100
BEGIN
SELECT @v1=(@v1+1)
SELECT @v1
*/

### 1.3.4 标识符

SQL Server为对象标识符提供了一系列的标准命名规则，同时提供了用限定标识符表示非标准标识符的方法。我们推荐你尽量使用标准的标识符字符来表示对象。
1、标准标识符
标准标识符可以包含1到128位字符，包括字母，符号(_、@或#)及数字。标准标识符中不允许有空格。
2、限定标识符
如果标识符遵守所有的标识符规则，则此标识符既可以和限定符一起使用，也可以单独使用。但如果它不遵守一个或多个的格式规则时，必须使用限定标识符。
在下列情况下，使用限定标识符：
当对象名字包含空格时；

当保留关键字被用作对象名或对象部分的名字时。

当限定标识符出现在Transact-SQL语句中时，必须使用中括号或双引号把限定标识符括起来。
用中括号表示括起来的标识符([])
SELECT * FROM [Blanks In Table Name]
注意 ：括起来的标识符总是可以被使用，不管SET QUOTED_IDENTIFER选项的状态如何。
用双引号表示引用的标识符(””)
SELECT * FROM “Blanks in Table Name”
只有SET QUOTED_IDENTIFIER选项为on时，才能使用引用的标识符。
3、标识符的命名原则
给数据库中的对象起名时，应该：
名字尽量短；

尽量使用有意义的名字；

使用简单的清晰的命名习惯；

使用能够区分出对象类型的标识符，尤其是视图和存储过程的名字；

保持对象名和用户名的唯一性。

### 1.3.5 数据类型

数据类型限制了数据库中保存的数值。数据类型指定了一个字段、参数或变量中所能存储的信息的类型。大多数Transact-SQL语句并不明确指定数据类型，但SQL语句中各对象数据类型的作用结果，将影响大多数语句的运行结果。
SQL Server提供了系统数据类型(基本数据类型)，但你也可以创建自定义数据类型。基本数据类型有以下几种：
1、数字型
这种类型的数据代表数字，包括各种整数如int、tinyint、smallint和bigint。还包含精确些的十进制小数如numeric、decimal、money和smallmoney。也包括浮点数如float和real。
2、日期型
这种类型的数据代表日期和日期范围。包含datetime，可以精确到0．333毫秒；及smalldatetime，精确到1分钟的时间间隔。
3、字符型
这种类型的数据用于表示字符数据或字符串，包括定长的字符串类型char和nchar，也包含变长字符串类型varchar和nvarchar。
4、二进制型
这种数据类型在存储和结构上很象字符型数据，但这种数据的内容被当作一串比特值对待。二进制数据包括binary和varbinary。bit这种类型的数据代表1位的值，即0或1。
5、唯一标识符(Unique Identifiers)
uniqueidentifier是一种特殊的数据类型，它代表一个全局的特殊标识符(GUID)，是一个16位16进制的数，它的值总是唯一的。
6、SQL变量
这些数据类型能够代表SQL Server所支持的各种数据类型，但不包括text、ntext、rowversion和Sql_variant这几种数据类型。
7、图像和文本(image&text)
这两种数据类型属于大型二进制对象结构(BLOB)，它们代表定长或变长的数据类型，其中可以存储Unicode、非Unicode及二进制数据，如image、text及ntext。
8、表（Tables）
表数据类型用于确定类型表的本地变量或用户定义函数的返回值。
9、游标(Cursors)
这种数据类型用于存储过程中，或在低层客户接口中使用。游标从不用于数据定义语言(DDL)语句中。
10、用户自定义数据类型
这种数据类型是由数据库管理员创建的，它基于系统数据类型。当多个表需要在一个字段存储同一类数据时，并且这些字段必须具有相同的数据类型、长度和可空属性(Nullability)时，你可以选择使用用户自定义数据类型。

### 1.3.6 变量

变量是可以赋值的SQL语句元素。在Transact-SQL中，你可以使用局部变量。
用户可以使用DECLARE语句来定义一个局部变量，通过使用SET或SELECT语句为这个局部变量赋值，然后就可以在它被定义的语句、批处理或过程中，使用这个局部变量。局部变量名前必须带有@。
注意：如果一个变量前面有两个@符号，那么它将被作为函数处理。
语法：
DECLARE{@10cal_variabledata_type}[,...n]
SET@local_variable_name=expression
下面的例子创建@EmpID和@vlname两个局部变量，给@vlname赋值后，根据@vlname的值查询数据库Northwind，然后把查询结果赋给@EmpID。
USE northwind
DECLARE @EmpID varchar(11)
，@vlName char(20)
SET @vlname=’Dodsworth’
SELECT @EmpID=employeeid
FROM employees
WHERE LastName=@vlname
SELECT @EmpID AS EmployeeID
GO
运行结果：
EmployeeID
9
(1row(s)affected)

### 1.3.7 系统函

数
在SELECT语句中，允许出现表达式的任何地方都可以使用系统函数。Transact-SQL提供了很多有返回值的系统函数。
函数一般需要一定的输入参数，并返回一定的值，这些返回值可以用在表达式中。Transact-SQL编程语言提供三种函数：
1、 聚集(Aggregate)函数

对一个集合中的值进行运算，然后返回一个单个的、汇总的值。
下面的例子计算products表中unitprice字段的平均值。
USE northwind
SELECT AVG(unitprice) AS AvgPrice
FROM products
GO
运行结果：
AvgPrice
28．8663
(1row(S)affected)
2、 标量(scalar)函数

只对单个值进行运算并返回单一的值。只要一个表达式是正确的就可以使用这些函数。标量函数可被分为以下几种。
函数类型 描述
设置函数 返回关于当前设置信息的值
游标函数 返回关于游标信息的函数
日期和时间函数 根据输入的日期和时间，运算并返回一个字符串、数值或日期、时间值
数学函数 根据输入的值进行数学计算，并返回一个数字值
元数据函数 返回关于数据库和数据库对象的信息
安全函数 返回关于用户和角色的值
字符串函数 根据输入字符的值(char或varchar )，返回一个字符串或数字值
系统函数 进行相应运算后，返回SQL Server内部关于值、对象和设置的信息
系统统计函数 返回关于系统的统计信息
下面的例子显示了一个元数据函数的使用，它返回当前所使用的数据库的名字。
USE northwind
SELECT DB_NAME() AS‘database’
GO
运行结果：
database
Northwind
(1row(s)affected)
3、 行集(Rowset)函数

在Transact-SQL语句中，行集函数可以用作表参考(table reference)。
下面的例子对表titles中的信息进行分布式的查询。
SELECT *
FROM OPENQUERY(OracleSvr , ’SELECT name，id FROM owner，titles，)
GO
下面是另外一些系统函数的例子：
SELECT ’ANSI:’, CONVERT(varchar(30), GETDATE(), 102) AS
Style
UNION
SELECT ’Japanese:’, CONVERT(varchar(30), GETDATE(), 111)
UNION
SELECT ’European:’, CONVERT(varchar(30), GETDATE(), 113)
GO

### 1.3.8 运算符

运算符是进行数学计算、字符操作及字段、常量和变量比较的符号。可以在查询条件中组合使用不同的运算符。当你组合使用这些运算符时，这些运算符是按照预先定义好的顺序被处理的。
部分语法
{constant/column_name/function/ (subquery)}
[{arithmetic_operator/string_operator/
AND.OR.NOT}
{constant/column_name/function/ (subquery)}.}
1、运算符的种类
SQL Server支持四种运算符：算术运算符、比较运算符、字符串运算符和逻辑运算符。
算术运算符
算术运算符对数字型的字段和常量进行运算。Transact-SQL支持的算术运算符包括：加(+)、减(-)、乘(*)、除(/)、取模(％)(整数被除后的整数余数)。
比较运算符
比较运算符比较两个表达式。可以在相同类型的变量、字段及表达式间进行比较操作。
下面列出了所有的比较运算符。
. = 等于

. 〉 大于

. < 小于

. >= 大于或等于

. <= 小于或等于

. <> 不等于

字符串运算符
字符串运算符(+)把两个字符串连起来。所有其它的字符操作都需使用字符操作函数进行。空字符不等于空值。
逻辑运算符
逻辑运算符与(AND)、或(OR)和非(NOT)用于连接WHERE子句中的查询条件。
2、运算符优先级
如果在表达式中，你需要结合使用多种运算符(逻辑或数学运算符)，SQL Server按照这些运算符的优先级别来处理这些运算符，这种顺序将会影响返回的值。各种运算符的优先级别如下(由高到低排列)。
类型 运算符 符号
分组 基本分组 ()
算术运算符 乘法 *／％
算术运算符 加法 -+
其余 字符串联 +
逻辑运算符 非 NOT
逻辑运算符 与 AND
逻辑运算符 或 OR
SQL Server首先处理最深一层的嵌套表达式。然后，如果表达式中所有的算术运算符的优先级别一致的话，由左到右处理各运算符。
注意：在SQL Server中，逻辑运算符的优先级别和其他编程语言的不一样。

### 1.3.9 表达式

表达式是各种符号和对单个数据进行操作的运算符组合。它们可能很简单，如一个常量、变量、字段或单个的值；或者可能很复杂，如由运算符连在一起的一个或多个表达式。
表达式结果的数据类型由表达式中的成员决定。在运算过程中，表达式的成员可能经常会出现隐含的数据类型转换。
下面的例子计算一次购物中的产品记录，首先对单价和数量进行乘法，然后对结果进行过滤，只有那些价钱大于10，000美元的记录才会被显示出来。
SELECT OrderID, ProductID
, (UnitPrice * Quantity) AS ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
运行结果：
OrderlD ProductID ExtendedAmount
10353 38 10540．0000
10417 38 10540．0000
10424 38 10329．2000
10865 38 15810．0000
10889 38 10540．0000
10981 38 15810．0000
(6 row(s) affected)

### 1.3.10 流控制语言

Transact-SQL包含控制逻辑流的语句，也包含CASE表达式，它允许你在一个SELECT或UPDATE语句中，每次对一个单个的行进行一次条件判断。
1、语句级（Statement level）
下面的语句可以使你在脚本语句中控制逻辑流：
BEGIN.END块, 包含在这个语句中的一系列Transact-SQL语句，都可以作为一个单元运行。

IF.ELSE块, 使用这个语句时，如果满足条件，SQL Server将执行IF中的语句，否则，执行ELSE中的语句。

WHILE块,只要满足条件，则WHILE下的语句将被重复执行。BREAK和CONTINUE能够在WHILE循环中控制语句的执行。

下面的例子中，演示了根据某顾客是否还有订单的情况，把顾客从顾客列表中相应地删除。
USE northwind
IF EXISTS (SELECT * FROM orders
WHERE customerid = ’fran’ )
PRINT ‘*** Customer cannot be deleted ***’
ELSE
BEGIN
DELETE customers WHERE customerid = ’frank’
PRINT ‘*** Customer deleted ***’
END
GO
2、行级（Row level）
在CASE语句中，列出几种可能的值，并逐一进行检测。如果表达式返回值是true，则CASE表达式返回WHEN子句中的值。如果表达式的返回值是false，并且指定了ELSE语句的话，SQL Server将返回ELSE子句中的值。你可以在使用表达式的任意地方使用CASE语句。
语法
CASE expression
{WHEN expression THEN result} [，.n]
[ELSE result]
END
下例声明了一个局部变量，并且检测它的值是等于4、5或6，根据它具体的值，进入WHILE循环判断当前值是奇数还是偶数。
DECLARE @n tinyint
SET @n = 5
IF (@n BETWEEN 4 and 6)
BEGIN
WHILE (@n > 0)
BEGIN
SELECT @n AS ‘Number’
，CASE
WHEN (@n％2) = 1
THEN ’ODD’，
ELSE ‘EVEN’
END AS ‘Type’
SET @n = @n - 1
END
END
ELSE
PRINT ‘NO ANALYSIS’
GO
运行结果：
Number Type
5 EVEN
(1 row(s) affected)
Number Type
4 ODD
(1 row(s) affected)
Number Type
3 EVEN
(1 row(s) affected)
Number Type
2 ODD
(1 row(s) affected)
Number Type
1 EVEN
(1 row(s) affected)
注意：在这个例子中的块语句(BEGIN／END)的使用能够改善脚本语句的可读性。

### 1.3.11 保留关键字

SQL Server为自己保留了一些专用的关键字。例如，在osql或SQL Query Analyzer中使用DUMP或BACKUP关键字时，表示SQL Server进行某一数据库部分的或全部的备份，或者进行事务日志的备份。
在Transact-SQL语句的任何其他地方，你都不能使用SQL Server已经定义的保留关键字。给一个对象起名时，你也应当避免使用保留关键字。如果一个对象的名字恰好是一个关键字，那么每次你需要引用这个对象名时，你必须使用限定标识符把这个对象名括起来，如引号或方括号。
检查Transact-SQL语句或数据库对象名中是否有保留关键字，这个任务通常由系统管理员、数据库管理员或数据库创建者来担任。
注意：用户构造出的语法上正确的Transact-SQL语句，即使能够通过语法检测和编译，在执行时仍可能出现运行时的错误。你养成一种良好的习惯，尽量不要使用保留关键字。

上篇文章: Transact-SQL语句的类型 下篇文章：使用SQL查询分析器 使用osql工具

【返回上页】【打印 此页】【查看参与评论】

相关文章： 没有相关文章