6.1 Transact-SQL概述
个人日记
是首先由IBM开发的数据库语言。Transact-SQL可用来从数据库中提取数据,执行SQL语言的数据定义(DDL)、数据操作(DML)和数据控制(DCC)等操作。
本节将介绍Transact-SQL的语法规则和语法元素。
6.1.1Transact-SQL的语法规则
为了使读者能够方便地阅读本书中关于Transact-SQL的内容,首先介绍Transact-SQL的语法规则,如表6.1所示。
表6.1 Transact-SOL的语法规则
规则 | 描述 |
大写 | Transact-SQL关键字 |
斜体 | Transact-SQL语法中用户提供的参数 |
|(竖线) | 分隔括号或大括号内的语法项目。只能选择一个项目 |
[](方括号) | 可选语法项目。不必键入方括号 |
{}(大括号) | 必选语法项。不要键入大括号 |
[, ...n] | 表示前面的项可重复n次。每一项由逗号分隔 |
[ ...n] | 表示前面的项可重复n次。每一项由空格分隔 |
加粗 | 数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样键入的文本 |
<标签>::= | 语法块的名称。此规则用于对可在语句中的多个位置使用的过长语法或语法单元部分进行分组和标记 |
除非另外指定,否则所有对数据库对象名的Transact-SQL引用可以是由四部分组成的名称,格式如下:
[
server_name.[database_name].[owner_name].
|database_name.[owner_name].
|owner_name.
]
]
object_name
●server_name指定链接服务器名称或远程服务器名称。
●当对象驻留在SQL Server数据库中时,database_name指定该SQL Server数据库的名称。当对象在链接服务器中时则指定OLE DB目录。
●如果对象在SQL Server数据库中,owner_name指定拥有该对象的用户。当对象在链接服务器中时则指定OLE DB架构名称。
●object_name引用对象的名称。
当引用某个特定对象时,不必总是为SQL Server指定标识该对象的服务器、数据库和所有者。可以省略中间级节点,而使用句点表示这些位置。对象名的有效格式是:
server.database.owner.object
server.database..object
server..owner.object
server..object
database.owner.object
database..object
owner.object
object
6.1.2Transact-SQL的语法元素
每一条Transact-SQL语句都包含一系列元素,这些元素可以划分为以下几种情况:
●标识符。诸如表、视图、列、数据库和服务器等对象的名称。对象标识符是在定义对象时创建的,标识符随后用于引用该对象。SQL Server的标识符有两类:常规标识符和分隔标识符。
常规标识符符合标识符的格式规则。在Transact-SQL语句中使用常规标识符时不用将其分隔。例如
SELECT*FROM TableX WHERE KeyCol =124
在上面的语句中,标识符TableX和KeyCol都是常规标识符·
分隔标识符包含在双引号(” ”)或者方括号([])内。符合标识符格式规则的标识符可以分隔,也可以不分隔。例如,上面的例子也可以写成
SELECT*FROM [TableX]WHERE [KeyCol ]=124
其中[TableX]和[KeyCol]都是分隔标识符。
在Transact-SOL语句中,对不符合所有标识符规则的标识符必须进行分隔。例如
SELECT *FROM [ My Table] WHERE [order]=10
[My Table]必须使用分隔标识符,因为My和Table之间有一个空格,如果不进行分隔,SQL Server会把它们看到是两个标识符,从而出现错误。[order]也必须使用分隔标识符,因为order是SQL Server的保留字,用于order by子句。
常规标识符和分隔标识符包含的字符数必须在1一128之间。对于本地临时表,标识符最多可以有116个字符。
●数据类型。定义数据对象(如列、变量和参数)所包含的数据类型。大多数Transact-SQL语句并不显式引用数据类型,但是其结果由于语句中所引用的对象数据类型间的互相作用而受到影响。
●函数。与其他程序设计语言中的函数相似,SQL Server函数可以有零个、一个或多个参数,并返回一个标量值或表格形式的值的集合。
● 表达式。表达式是SQL Server可解析为单个值的语法单元。例如常量、返回单值的函数、列或变量的引用。
● 运算符。运算符中表达式的组成部分之一,它与一个或多个简单表达式一起使用构造一个更为复杂的表达式。例如,将“-”(负号)运算符和常量12组合在一起得到常量-12。
● 注释。优秀的程序设计人员,不仅代码写得好,而且会在代码中适当地插入注释。SQL Server将不执行注释的内容。
SQL Server支持两种类型的注释字符:--(双连字符)和/*…*/(正斜杠一星号对)。
---可与要执行的代码处在同一行,也可另起一行。从双连字符开始到行尾均为注释。对于多行注释,必须在每个注释行的开始使用双连字符。例如
--Choose the pubs database
USE pubs
/*…*/可与要执行的代码处在同一行,也可另起一行,甚至在可执行代码内。从开始注释对(/*)到结束注释对(*/)之间的全部内容均视为注释部分。对于多行注释,必须使用开始注释字符对(/*)开始注释,使用结束注释字符对(*/)结束注释。注释行上不应出现其他注释字符。例如
/* Author.Johney Lee
Date:2002-7-16
*/
USE pubs
多行/* */注释不能跨越批处理。整个注释必须包含在一个批处理内。例如,在SQL查询分析器和osql实用工具中,GO命令标志批处理的结束。当实用工具在一行的前两个字节中读到字符GO时,则把从上一GO命令开始的所有代码作为一个批处理发送到服务器。如果GO出现在/*和*/分隔符之间的一行行首,则在每个批处理中都发送不匹配的注释分隔符,从而导致语法错误。
●保留关键字。保留下来由SQL Server使用的词。建议数据库中的对象名不要使用这些字词。如果必须使用保留关键字,则使用分隔标识符。
6.2常量和变量
常量和变量是程序设计过程中必不可少的元素。本节将对Transact-SQL语言的常量和变量进行介绍。
6.2.1常量
常量,也称为字面值或标量值,是表示一个特定数据值的符号。常量的格式取决于它所表示的值的数据类型。
Transact-SQL语言的常量包含以下几种类型:
●字符串常量。字符串常量包含在单引号内,由字母数字字符(a-z, A-Z和0-9)以及特殊字符( 例如!、@ 和#)组成。例如
‘Process X is 50% complete.’
如果单引号中的字符串包含一个嵌入的引号,可以使用两个单引号表示嵌入的单引号。对于嵌入在双引号中的字符串则没有必要这样做。例如,字符串I’m Johney可以表示为
‘I’’m Johney’
空字符串用中间没有任何字符的两个单引号表示。
●Unicode字符串常量。Unicode字符串的格式与普通字符串相似,但它前面有一个N标识符(N代表SQL-92标准中的国际语言(National Language)。 N前缀必须是大写字母。例如,’Michel’是字符串常量而N’Michel’则是Unicode常量。
Unicode常量被解释为Unicode数据,并且不使用代码页进行计算。Unicode数据中的每个字符都使用两个字节进行存储,而字符数据中的每个字符则都使用一个字节进行存储。
●二进制常量。二进制常量具有前辍0x,并且是十六进制数字字符串。这些常量不使用引号。例如:
OxAE
Ox12Ef
Ox69048AEFDD010E
Ox(空二进制常量)
●bit常量。bit常量使用数字0或1表示,并且不使用引号。如果使用一个大于1的数字,它将被转换为1。
●datetime常量。datetime常量使用特定格式的字符日期值表示,并被单引号括起来。
例如:
‘April 15,1998’
‘15 April,1998’
‘980415’
‘04/15/98’
‘14:30:24’
‘04:24 PM’
●integer常量。integer常量必须是整数,不能包含小数点。例如:
1894
2
●decimal常量。decimal常量由没有用引号括起来,并且包含小数点的一串数字表示。
例如:
1894.1204
2.0
● float和real常量。float和real常量使用科学记数法表示。例如:
101.5E5
101.5E-5
0.5E2
0.5E-2
●money常量。money常量表示以可选货币符号作为前缀的一串数字。money常量可以包含小数点,但是不能使用引号。例如:
$12
$542023.14
●uniqueidentifier常量。uniqueidentifier常量是表示全局唯一标识符(GUID)值的字符串。可以使用字符或二进制字符串格式指定。例如:
‘6F9619FF-8B86-D011-B42D-00C04FC964FF’
0xff19966f868b11d00c04fc964ff
●指定负数和正数。在数字前面添加+ 或 - ,指明一个数是正数还是负数。例如:
+145234
-21483648
+14534.34
-214748.10
+123E-3
-12E5
-$45.56
+$423456.99
6.2.2变量
变量对应内存中的一个存储空间。与常量不同,变量的值在程序运行过程中可以随时改变。在Transact-SQL中,包含两种类型的变量:即局部变量和全局变量。
局部变量是用户在程序中定义的变量,它仅在定义的程序范围内有效。局部变量可以用来保存从表中读取的数据,也可以作为临时变量保存计算的中间结果。在批处理和脚本中的变量通常有以下作用:
●作为计数器计算循环执行的次数或控制循环执行的次数;
●保存数据值以供控制流语句测试;
●保存由存储过程返回代码返回的数据值。
变量只有在声明以后才能被使用。Transact-SQL语言使用DECLARE语句来声明变量。第一次声明变量时将此变量的值设为NULL。 SQL Server支持2种对变量赋值的方法:
●使用SET语句;
●使用SELECT语句。
若要通过使用SET语句为变量赋值,请包含变量名和需要赋给变量的值。
关于DECLARE语句、SET语句和 SELECT语句的具体使用,请参见6.4节。
全局变量以@@开头,实际上是SQL Server的系统函数。用户可以在程序中,使用全局变量测试系统特性和Transact-SQL命令的执行情况。
6.3运算符与表达式
运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。SQL Server 2000使用下列几类运算符:
●算术运算符;
●赋值运算符;
●位运算符;
●比较运算符;
●逻辑运算符;
●字符串串联运算符;
●一元运算符。
6.3.1算术运算符
算术运算符在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。SQL Server 2000的算术运算符如表6.2所示。
表6.2 算术运算符
运算符 | 描述 |
+(加号) | 加法 |
-(减号) | 减法 |
*(乘号) | 乘法 |
/(除号) | 除法 |
% (模) | 返回一个除法的整数余数。例如,13 % 6=1 |
6.3.2赋值运算符
Transact-SQL有一个赋值运算符(=)。它通常与SET语句一起使用,为变量赋值。例如:
DECLARE @MyCounter INT
SET @MyCounter=1
6.3.3位运算符
位运算符作用于2个整型数据,对数据进行按位运算。SQL Server 2000的位运算符如表。
6.3所示。
表6.3 位运算符
运算符 | 描述 |
& | 按位进行与运算(两个操作数) |
| | 按位进行或运算(两个操作数) |
^ | 按位进行异或运算(两个操作数) |
关于按位进行与运算、或运算和异或运算的计算规则如表6.4所示。
表6.4 按位进行与运算、或运算和异或运算的计算规则
位1 | 位2 | & 运算 | | 运算 | ^ 运算 |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
6.3.4比较运算符
比较运算符测试两个表达式是否相同。除了text,、ntext或image数据类型的表达式外,比较运算符可以用于所有的表达式。
比较运算符的结果是布尔数据类型,它有3种值:TRUE, FALSE及UNKNOWN。SQL Server 2000的比较运算符如表6.5所示。
表6.5 比较运算符
运算符 | 描述 |
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
<> | 不等于 |
!= | 不等于 |
!< | 不小于 |
!> | 不大于 |
6.3.5逻辑运算符
逻辑运算符对某个条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回带有TRUE或FALSE值的布尔数据类型。
SQL Server 2000的逻辑运算符如表6.6所示。
表6.6 逻辑运算符
运算符 | 描述 |
ALL | 如果一系列的比较都为TRUE,那么就为TRUE.例如5>ALL (3, 2, 1)的结果是TRUE; 而5>ALL(3, 6, 2)的结果是FALSE,因为5小于6 |
AND | 如果两个布尔表达式都为TRUE,那么就为TRUE |
ANY | 如果一系列的比较中任何一个为TRUE,那么就为TRUE。例如5>ANY(3, 6, 8)的结果是TRUE,因为3, 6和8中有一个小于5的数 |
BETWEEN | 如果操作数在某个范围之内,那么就为TRUE. BETWEEN通常与八ND一起使用。例如5 BETWEEN 3 AND 6的结果是TRUE |
EXISTS | 如果子查询包含一些行,那么就为TRUE |
IN | 如果操作数等于表达式列表中的一个,那么就为TRUE.例如5 IN(1, 2, 4)的结果是 FALSE,因为5不没有出现在列表中 |
LIKE | 如果操作数与一种模式相匹配,那么就为TRUE.。LIKE子句中会使用%和_等通配符。 _表示一个字符,%表示一个字符串。例如_sql表示在sql前面有一个字符的字符串。对于表达式Varx LIKE _sql来说,当变量Varx符合_sq1的模式,则返回TRUE,否则返回FALSE |
NOT | 对任何其他布尔运算符的值取反 |
OR | 如果两个布尔表达式中的一个为TRUE,那么就为TRUE |
SOME | 如果在一系列比较中,有些为TRUE,那么就为TRUE。 SOME与ANY的功能相同 |
6.3.6字符串串联运算符
字符串串联运算符允许通过加号(+)进行字符串串联,这个加号也被称为字符串串联运算符。其他所有的字符串操作都可以通过字符串函数进行处理。例如:
“abc”+”efg”
的结果是
“abcefg”
6.3.7一元运算符
一元运算符只对一个表达式执行操作,这个表达式可以是数字数据类型分类中的任何一种数据类型。
SQL Server 2000的一元运算符如表6.7所示。
表6.7 一元运算符
运算符 | 描述 |
+ | 数值为正 |
- | 数值为负 |
~ | 返回数字的补数 |
6.4常用函数
函数对于任何程序设计语言都是非常关键的组成部分。Transact-SQL语言为程序员提供了非常丰富函数,足以满足您工作的需要。
Transact-SQL的函数可以分为以下几类:
●聚合函数:
●配置函数;
●游标函数;
●日期和时间函数:
●数学函数;
●元数据函数;
●行集函数;
●安全函数;
●字符串函数;
●系统函数;
●系统统计函数;
●文本和图像函数。
由于篇幅所限,本节只能对一些常用的函数进行详细介绍。
6.4.1聚合函数
聚合函数对一组值执行计算并返回单一的值。聚合函数经常与SELECT语句的GROUPBY子句一同使用。
聚合函数及其功能如表6.8所示。
表6.8 聚合函数及其功能
聚合函数 | 功能 |
AVG | 返回组中值的平均值 |
BINARY_CHECKSUM | 返回对表中的行或表达式列表计算的二进制校验值 |
CHECKSUM | 返回在表的行上或在表达式列表上计算的校验值。CHECKSUM用于生成哈希索引 |
CHECKSUM_ AGG | 返回组中值的校验值 |
COUNT | 返回组中项目的数量 |
COUNT_BIG | 返回组中项目的数量。COUNT BIG的使用与COUNT函数相似。它们之间的唯一差别是它们的返回值:COUNT_BIG总是返回bigint数据类型值,而COUNT则总是返回int数据类型值 |
GROUPING | 产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,附加的列输出值为1,当所添加的行不是由CUBE或ROLLUP产生时,附加列值为0 |
MAX | 返回表达式的最大值 |
MIN | 返回表达式的最小值 |
SUM | 返回表达式中所有值的和,或只返回DISTINCT值。SUM只能用于数字列 |
STDEV | 返回给定表达式中所有值的统计标准偏差 |
STDEVP | 返回给定表达式中所有值的填充统计标准偏差 |
VAR | 返回给定表达式中所有值的统计方差 |
VARP | 返回给定表达式中所有值的填充的统计方差 |
请看以下几个常用聚合函数的示例。示例中涉及到的SELECT命令,将在本书第7章中介绍。
注意,读者如果要调试以下示例,可以使用osql实用工具。
● AVG如果要统计员工表Employee中所有员工的平均年龄,请执行以下命令。
USE newdb
SELECT AVG(Age)FROM Employee
GO
运行结果为
--------
31
(1行受到影响)
● COUNT如果要统计员工表Employee中员工的数量,请执行以下命令
USE nwedb
SELECT COUNT(Emp_id)FROM Employee
GO
运行结果为
--------
12
(1行受到影响)
● MAX如果要统计员工表Employee中的员工最大年龄,请执行以下命令:
USE newdb
SELECT MAX(Age) FROM Employee
GO
运行结果为
-------
42
(1行受到影响)
● sum如果要统计员工表Employee中的所有员工的工资总数,请执行以下命令:
USE newdb
SELECT SUM(wage) FROM Employee
GO
运行结果为
-------------------------------
41200.00
(1行受到影响)
6.4.2日期和时间函数
日期和时间函数对日期和时间输入值执行操作,并返回一个字符串、数字值或日期和时间值。日期和时间函数及其功能如表6.9所示。
表6-9 日期和时间函数及其功能
日期和时间函数 | 功能 |
DATEADD | 在向指定日期加上一段时间的基础上,返回新的datetime值 |
DATEDIFF | 返回跨两个指定日期的日期和时间边界数 |
DATENAME | 返回代表指定日期的指定日期部分的字符串 |
DATEPART | 返回代表指定日期的指定日期部分的整数 |
DAY | 返回代表指定日期的天的日期部分的整数 |
GETDATE | 按datetime值的SQL Server标准内部格式返回当前系统日期和时间 |
GETUTCDATE | 返回表示当前UTC时间(世界时间坐标或格林尼治标准时间)的datetime 值。当前的UTC时间得自当前的本地时间和运行SQL Server的计算机操作系统中的时区设置 |
MONTH | 返回代表指定日期月份的整数 |
YEAR | 返回表示指定日期中的年份的整数 |
请看以下几个常用日期和时间函数的示例。
● GETDATE如果要查看当前的日期,请执行以下命令:
SELECT GETDATE
GO
运行结果为
-----------
2002-07-22 13:20:42.263
(1行受到影响)
● DATEADD如果要计算当前日期后21天的日期,请执行以下命令:
DECLARE@VarDate datetime
SET @VarDate=GETDATE()
SELECT DATEADD(day,21,@VarDate)
GO
运行结果为
--------------
2002-08-12 13:24:01.650
(1行受到影响)
● DAY如果要提取当前日期的天部分的整数,请执行以下命令:
DECLARE @VarDate datetime
SET @VarDate =GETDATE()
SELECT DAY (@VarDate)
GO
运行结果为
---------
22
(1行受到影响)
6.4.3数学函数
数学函数通常对作为参数提供的输入值执行计算,并返回一个数字值。
数学函数及其功能如表6.10所示。
表6.10 数学函数及其功能
数学函数 | 功能 |
ABS | 返回给定数字表达式的绝对值 |
ACOS | 返回以弧度表示的角度值,该角度值的余弦为给定的float表达式;本函数亦称反余弦 |
ASIN | 返回以弧度表示的角度值,该角度值的正弦为给定的float表达式;亦称反正弦 |
ATAN | 返回以弧度表示的角度值,该角度值的正切为给定的float表达式:亦称反正切 |
ATN2 | 返回以弧度表示的角度值,该角度值的正切介于两个给定的float表达式之间;亦称反正切 |
CEILING | 返回大于或等于所给数字表达式的最小整数 |
COS | 返回给定表达式中给定角度(以弧度为单位)的三角余弦值 |
COT | 返回给定float表达式中指定角度(以弧度为单位)的三角余切值 |
DEGREES | 当给出以弧度为单位的角度时,返回相应的以度数为单位的角度 |
EXP | 返回所给的float表达式的指数值 |
FLOOR | 返回小于或等于所给数字表达式的最大整数 |
LOG | 返回给定float表达式的自然对数 |
LOG10 | 返回给定float表达式的以10为底的对数 |
PI | 返回二的常量值 |
POWER | 返回给定表达式乘指定次方的值 |
RADIANS | 对于在数字表达式中输入的度数值返回弧度值 |
RAND | 返回0~1之间的随机float值 |
ROUND | 返回数字表达式并四舍五入为指定的长度或精度 |
SIGN | 返回给定表达式的正(+1)、零(0)或负(-1)号 |
SIN | 以近似数字(float)表达式返回给定角度(以弧度为单位)的三角正弦值 |
SQUARE | 返回给定表达式的平方 |
SQR7 | 返回给定表达式的平方根 |
TAN | 返回输入表达式的正切值 |
请看以下几个常用数学函数的示例。
● ABS如果要计算一4的绝对值,请执行以下命令:
SELECT ABS(-4)
GO
运行结果为
-------------
4
(1行受到影响)
● CEILING分别对正数、负数和0计算CEILING,请执行以下命令:
SELECT CEILING(12.34),CEILING(-12.34),CEILING(0)
GO
运行结果为
---- --- - --------
13 –12 0
(1行受到影响)
● ROUND请执行以下命令,注意观察长度变化对结果的影响。
SELECTROUND(123.456,2),ROUND(123.456,1),ROUND(123.456,0),ROUND(123.456,-1),ROUND(123.456,-2), ROUND(123.456,-3)
GO
运行结果为
----------- --------- --------- -------- -------- ---------
123.460 123.500 123.000 120.000 100.000 .000
6.4.4字符串函数
字符串函数对字符串输入值执行操作,返回字符串或数字值。
字符串函数及其功能如表6.11所示。
表6.11 字符串函数及其功能
字符串函数 | 功能 | |
ASCII | 返回字符表达式最左端字符的ASCII代码值 | |
CHAR | 将int ASCII代码转换为字符的字符串函数 | |
CHARINDEX | 返回字符串中指定表达式的起始位置 | |
DIFFERENCE | 以整数返回两个字符表达式的SOUNDEX值之差 | |
LEFT | 返回从字符串左边开始指定个数的字符 | |
LEN | 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格 | |
LOWER | 将大写字符数据转换为小写字符数据后返回字符表达式 | |
LTRIM | 删除起始空格后返回字符表达式 | |
NCHAR | 根据Unicode标准所进行的定义,用给定整数代码返回Unicode字符 | |
PATINDEX | 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零 | |
QUOTENAME | 返回带有分隔符的Unicode字符串,分隔符的加入可使输入的字符串成为有效的SQL Server分隔标识符 | |
REPLACE | 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式 | |
REPLICATE | 以指定的次数重复字符表达式 | |
REVERSE | 返回字符表达式的反转 | |
RIGHT | 返回字符串中从右边开始指定个数的integer_expressio刀字符 | |
RTRIM | 截断所有尾随空格后返回一个字符串 | |
SOUNDEX | 返回由四个字符组成的代码(SOUNDER)以评估两个字符串的相似性 | |
SPACE | 返回由重复的空格组成的字符串 | |
STR | 由数字数据转换来的字符数据 | |
STUFF | 删除指定长度的字符并在指定的起始点插入另一组字符 | |
SUESTRING | 返回字符、binary、 text或image表达式的一部分 | |
UNICODE | 按照Unicode标准的定义,返回输入表达式的第一个字符的整数值 | |
UPPER | 返回将小写字符数据转换为大写的字符表达式 |
请看以下几个常用字符串函数的示例。
● ASCII请执行以下命令:
SELECT ASCII(‘ABC’)
GO
运行结果为
--------------
65
(1行受到影响)
表明字符A的ASCII码为65。
● CHAR请执行以下命令:
SELECTCHAR(65)
GO
运行结果为
----
A
(1行受到影响)
● LEFT如果要返回字符串ABCDE的左侧3个字符,请执行以下命令:
SELECT LEFT(’ABCDE’,3)
GO
运行结果为
------
ABC
(1行受到影响)
● LEN如果要返回字符串ABCDE的长度,请执行以下命令:
SELECCT LEN(’ABCDE’)
GO
运行结果为
-------
5
(1行受到影响)
● LOWER如果要将字符串ABCDE转换为小写字母,请执行以下命令:
SELECT LOWER(’ABCDE’)
GO
运行结果为
-------
abcde
(1行受到影响)
● LTRIM请执行以下命令:
DECLARE @varstr char(50)
SET @varstr=‘abc’
SELECT ‘123’+LTRIM@varstr+’123’
GO
运行结果为
---------------------------------------
123abc
(1行受到影响)
可以看出,只有左侧的空格被删除了。
● REPLACE如果要把字符串ABCDE中的CD替换为123,请执行以下命令:
DECLARE @varstr char(50)
SET @varstr=REPLACE(‘ABCDE’,’CD’,’123’)
SELECT @varstr
GO
运行结果为
-----------------
AB123E
(1行受到影响)
● SPACE请执行以下命令:
DECLARE @varstr char(50)
SET @varstr=‘abc’+SPACE(5)+’123’
SELECT @varstr,LEN @varstr)
GO
运行结果为
------------------------- --------
Abc 123 11
(1行受到影响)
可以看出,在字符串abc和123之间出现了5个字符串,而字符串的长度为ll。
●STR如果要将计算的结果以字符串的形式显示,请执行以下命令:
DECLARE@varstr decimal(15,2)
SET @varstr=12*4.2
PRINT’12*4.2 的结果是:’+STR@varstr,5,1)
GO
运行结果为
12*4.2的结果是:50.4
●SUBSTRING如果要截取字符串ABCDEFG中第2个字符开始的3个字符,请看以下示例程序:
SELECT SUBSTRING(‘ABCDEFG’,2,3)
GO
运行结果为
------
BCD
(1行受到影响)
● UPPER如果要将字符串ABCDE转换为大写字母,请执行以下命令:
SELECT UPPER(’abcde’)
GO
运行结果为
--------
ABCDE
(1行受到影响)
6.4.5文本和图像函数
文本和图像函数对文本或图像输入值或列执行操作,返回有关这些值的信息。
文本和图像函数及其功能如表6.12所示。
表6.12 文本和图像函数及其功能
文本和图像函数 | 功能 |
PATINDEX | 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零 |
TEXTPTR | 以varbinary格式返回对应于text, next或image列的文本指针值。检索到的文本指针值可用于READTEXT, WRITETEXT和UPDATETEXT语句 |
TEXTVALID | 一个text、ntext或image函数,用于检查给定文本指针是否有效 |
第7章Transact-SQL数据库操作语句
7.1数据库管理语句
在第4章中,读者己经了解了SQL Server数据库的创建和维护。但是这些数据库操作都是在SQL Server企业管理器中手工进行的。这种操作方式非常简单直观,便于学习和掌握。但是,它不能将工作的过程保存下来,每次操作都需要重复进行,操作量大的时候不易使用。
在很多情况下,需要在程序或脚本中完成对数据库的操作。Transact-SQL提供了数据库管理语句,包括创建数据库、修改数据库、删除数据库、分离数据库和附加数据库等等。
7.1.1创建数据库语句CREATE DATABASE
CREATE DATABASE语句的功能是创建一个新数据库及存储该数据库的文件,或从先前创建的数据库文件中附加数据库。
在创建数据库时,有时需要定义存储该数据库的文件。所以在介绍CREATE DATABASE语句之前,应该首先了解文件<filespec>和文件组<filegroup>的语法。
<filespec>的语法结构如下:
<filespec>::=
[PRIMARY]
([NAME=logical_file_name,]
FILENAME=‘os_file_name’
[,SIZE=size]
[,MAXSIZE={max_size|UNLIMITED}]
[,FILEGROWTH=growth_increment])[,…n]
参数说明如下:
● 定义主文件〔PRIMARY ]。 PRIMARY指定关联的<filespec>列表定义主文件。主
文件组包含所有数据库系统表。还包含所有未指派给用户文件组的对象。主文件组的第一个<filespec>条目成为主文件,该文件包含数据库的逻辑起点及其系统表。一个数据库只能有一个主文件。如果没有指定PRIMARY那么CREATE DATABASE语句中列出的第一个文件将成为主文件。
● 指定逻辑名称[NAME=logical_file_name,]。NAME为由<filespec>定义的文件指定逻辑名称。
logical_file_name用来在创建数据库后执行的Transact-SQL语句中引用文件的名称。logical_file_ name在数据库中必须唯一,并且符合标识符的规则。
● 指定操作系统文件名FILENAME=‘os_file_ name’。FILENAME为<filespec>定义的文件指定操作系统文件名。
‘os_f:ile_name’是操作系统创建<filespec>定义的物理文件时使用的路径名和文件名。os_file_ name中的路径必须指定SQL Server实例上的目录。os_file _name不能指定压缩文件系统中的目录。
● 定义文件大小〔,SIZE二size}。SIZE指定<filespec>中定义的文件的大小。如果主文件的<filespec>中没有提供SIZE参数,那么SQL Server将使用model数据库中的主文件大小。如果次要文件或日志文件的<filespec>中没有指定SIZE参数,则SQL Server将使文件大小为1 MB。
Size是<filespec>中定义的文件的初始大小。可以使用千字节(KB)、兆字节(MB)、千兆字节(GB)或兆兆字节(TB)后缀。默认值为MB。指定一个整数,不要包含小数位。size的最小值为512 KB。如果没有指定size,则默认值为1 MB。为主文件指定的大小至少应与model数据库的主文件大小相同。
● 定义文件的最大尺寸[,MAXSIZE={max_size I UNLIMITED}]。MAXSIZE指定<filespec>中定义的文件可以增长到的最大大小。
max_size是<filespec>中定义的文件可以增长到的最大大小。可以使用千字节(KB),兆字节(MB)、千兆字节(GB)或兆兆字节(TB)后缀。默认值为MB。指定一个整数,不要包含小数位。如果没有指定max_srze,那么文件将增长到磁盘变满为止。
● UNLIMITED参数。UNLIMITED指定<filespec>中定义的文件将增长到磁盘变满为止。
●定义文件的增长增量[,FILEGROWTH=growth_increment]。FILEGROWTH指定<filespec>中定义的文件的增长增量。文件的FILEGROWTH设置不能超过MAXSIZE设置。
growth_increment是每次需要新的空间时为文件添加的空间大小。指定一个整数,不要包含小数位。0值表示不增长。该值可以MB, kB, GB, TB或百分比(%)为单位指定。如果未在数量后面指定MB, kB或%,则默认值为MB。如果指定%,则增量大小为发生增长时文件大小的指定百分比。如果没有指定FILEGROWTH,则默认值为10%,最小值为64kB。指定的大小舍入为最接近的64 kB的倍数。
<filegroup>的语法结构如下:
<fileguoup>::=
FILEGROUP filegroup_name<filespec>[,…n]
在CREATE DATABASE语句中,将使用<filespec>R<filegroup>来描述数据库文件。
CREATE DATABASE的语法结构如下:
CRETE DATABASE datebase_name
[ON
[<filespec>[,…n]
[,<filegroup>[,…n]]
]
[LOGON{<filespec>[,…n]}]
[COLLATE collation_name]
[FOR LOAD|FOR ATTACH]
下面,依次介绍各参数的使用情况。
● 指定数据库名称database_name. database_name是新数据库的名称。数据库名称在
服务器中必须唯一,并且符合标识符的规则。例如,要创建一个名为mytest的数据库,可以使用以下命令:
CREATE DATABASE mytest
因为没有设置其他参数,所以其他选项均为默认值。
● 设置存储数据库的磁盘文件。ON指定用来存储数据库数据部分的磁盘文件(数据文件)。该关键字后跟以逗号分隔的<filespec>项列表,<filespec>项用以定义主文件组的数据文件。主文件组的文件列表后可跟以逗号分隔的<filegroup>项列表,<filegroup>项用以定义用户文件组及其文件。n占位符表示可以为新数据库指定多个文件。
请看下面的示例:
USE master
GO
CREATE DATABASE Archive
ON
PRIMARY (NAME=Arch1,
FILENAME='c:\program files\microsoft sql server\mssql\data\archdqt1.mdf',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20),
(NAME= Arch2,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt2.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20),
(NAME=Arch3,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt3.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20)
在创建数据库时,指定了存储数据库的文件组。在osql中运行上面的代码,结果为:
------------------------------
CREATE DATABASE 进程正在磁盘’Arch1’上分配 100.00MB的空间。
CREATE DATABASE 进程正在磁盘’Arch2’上分配 100.00MB的空间。
CREATE DATABASE 进程正在磁盘’Arch3’上分配 100.00MB的空间。
-------------------------------
在企业管理器中,可以看到新建的数据库Archive.右击数据库Archive,选择“属性”命令,打开"Archive属性”对话框。选择“数据文件”选项卡,就可以看到数据文件的设置情况,与Transact-SQL指令的要求完全相同,如图7.1所示。
图7.1检查数据库创建后的数据文件
● 设置存储数据库日志的磁盘文件。LOG ON指定用来存储数据库日志的磁盘文件。该关键字后跟以逗号分隔的<filespec>项列表,<filespec>项用以定义日志文件。如果没有指定LOG ON,将自动创建一个日志文件,该文件使用系统生成的名称,大小为数据库中所有数据文件总大小的25%。
例如上面的示例程序如果增加数据库日志部分的设置,将变成以下内容:
USE master
GO
CREATE DATABASE Archive
ON
PRIMARY (NAME =Arch1,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt1.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20),
(NAME=Arch2,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt2.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20),
(NAME=Arch3,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt3.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20)
LOG ON
(NAME=Archlog1,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt1.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20),
(NAME=Archlog2,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt2.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20)
GO
增加了两个日志文件,Archlog 1和Archlog2o运行结果为:
------------------
CREATE DATABASE 进程正在磁盘 'Arch1' 上分配 100.00 MB 的空间。
CREATE DATABASE 进程正在磁盘 'Arch2' 上分配 100.00 MB 的空间。
CREATE DATABASE 进程正在磁盘 'Arch3' 上分配 100.00 MB 的空间。
CREATE DATABASE 进程正在磁盘 'Archlog1' 上分配 100.00 MB 的空间。
CREATE DATABASE 进程正在磁盘 'Archlog2' 上分配 100.00 MB 的空间。
-------------------
在企业管理器中,右击数据库Archive,选择“属性”命令,打开“Archive属性”对话框。选择“事务日志”选项卡,就可以看到日志文件的设置情况,与Transact-SQL指令的要求完全相同,如图7.2所示。
图7.2检查数据库创建后的日志文件
●排序规则。COLLATE子句的功能是定义排序规则,或应用于字符串表达式以应用排序规则投影。collation_name指定数据库的默认排序规则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规则名称。如果没有指定排序规则,则将SQL Server实例的默认排序规则指派为数据库的排序规则。
● FOR LOAD子句。FOR LOAD子句是为了与早期版本的SQL Server兼容。数据库在打开dbo use only数据库选项的情况下创建,并且将其状态设置为正在装载。SQL Server 7.0版中不需要该子句,因为RESTORE语句可以作为还原操作的一部分重新创建数据库。
● 附加数据库。FOR ATTACH指定从现有的一组操作系统文件中附加数据库。必须有指定第一个主文件的<filespec>条目。至于其他<filespec>条目,只需要与第一次创建数据库或上一次附加数据库时路径不同的文件的那些条目。必须为这些文件指定<filespec>条目。附加的数据库必须使用与SQL Server相同的代码页和排序次序创建。通常应使用sp attach- d6系统存储过程,而不要直接使用CREATE DATABASE FOR ATTACH.只有必须指定16个以上的<filespec>项目时,才需要使用CREATE DATABASE FOR ATTACH。
请看以下示例程序:
sq_detach_db Archive
GO
CREATE DATABASE Archive
ON PRIARY(FILENAME= ‘c:\program files\microsoft sql server\mssql\data\archdqt1.mdf’)
FOR ATTACH
GO
这段程序的作用是首先将数据库Archive分离,然后再通过附加数据库操作将其恢复。存储过程sp_detach_db的作用是分离数据库。
7.1.2修改数据序语句ALTER DATABASE
使用ALTER DATABASE语句可以在数据库中添加或删除文件和文件组。也可以用来更改文件和文件组的属性,例如更改文件的名称和大小。ALTER DATABASE提供了更改数据库名称、文件组名称以及数据文件和日志文件的逻辑名称的能力。
ALTER DATABASE语句的语法结构如下:
ALTER DATABASE database
{ADD FILE <filespec>[,…n][TO FILEGROUP filegroup_name]
|ADD LOG FILE logical_file_name
|REMOVE FILE logical_file_name
|ADD FILEGROUP filegroup_name
|REMOVE FILEGROUP filegroup_name
|MODIFY FILE<filespec>
|MODIFY NAME=new_dbname
|MODIFY FILEGROUP filegroup_name {filegroup_property|NAME=new_filegroup_name}
|SET<optionspec>[,…n][WITH<termination>]
|COLLATE<collation_name>
}
参数说明如下:
● 指定数据库名称database。 database是要更改的数据库的名称。
● 指定要添加的文件。ADD FILE子句表示要添加文件。TO FILEGROUP子句指定要将指定文件添加到的文件组。filegroup_name是要添加指定文件的文件组名称。
例如要在数据库Archive中添加一个文件Arch4,可以使用以下命令:
ALTER DATABASE Archive
ADD FILE
(NAME=Arch4,
FILENAME=' c:\program files\microsoft sql server\mssql\data\archdqt4.mdf ',
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20)
GO
运行结果显示:
以100.00MB为单位在磁盘 ‘Arch4’上扩展数据库。
检查“Archive属性”对话框,在“数据文件”选项卡中,可以看到Arch4,如图7.3所示。
图7.3使用ALTER DATABASE语句添加的Arch4
● 添加日志文件。ADD LOG FILE子句指定要将日志文件添加到指定的数据库。
例如要在数据库Archive中添加一个日志文件Archlog3,可以使用以下命令:
ALTER DATABASE Archive
ADD LOG FILE
(NAME =Archlog3,
FILENAME = ‘c:\program files\microsoft sql server \mssql\data\archlog3.ldf,
SIZE=100MB,
MAXSIZE=200,
FILEGROWTH=20)
GO
运行结果显示:
以100.00MB为单位在磁盘 ‘Archlog3’上扩展数据库。
同样可以在"Archive属性”对话框的“事务日志”选项卡中看到新增的Archlog3o
● 删除文件。REMOVE FILE从数据库系统表中删除文件描述并删除物理文件。只有在文件为空时才能删除。
例如要将Arch4从Archive数据库中删除,可以使用以下命令:
ALTER DATABASE Archive
REMOVE FILE arch4
GO
运行结果显示:
文件’arch4’已删除。
● 添加文件组。ADD FILEGROUP子句指定要添加文件组。filegroup_name是要添加的文件组名称。
● 删除文件组。REMOVE FILEGROUP子句从数据库中删除文件组并删除该文件组中的所有文件。
● 修改文件。MODIFY FILE子句指定要更改给定的文件,更改选项包括FILENAME,SIZE, FILEGROWTH和MAXSIZE。一次只能更改这些属性中的一种。必须在<filespec>中指定NAME,以标识要更改的文件。如果指定了SIZE那么新大小必须比文件当前大小要大。只能为tempdb数据库中的文件指定FILENAME,而且新名称只有在SQL Server重新启动后才能生效。
例如,要把数据库Archive中的Arch3的文件大小更改为200MB,可以使用以下命令:
ALTER DATABASE Archive
MODIFY FILE
(NAME=Arch3,
SIZE=200MB)
GO
● 重命名数据库。MODIFY NAME=new_dbname子句用来重命名数据库。
● 修改文件组。MODIFY FILEGROUP filegroup_name{filegroup_property|NAME=new _filegroup_name}指定要修改的文件组和所需的改动。如果指定filegroup_name和NAME=new filegroup_name,则将此文件组的名称改为new filegroup_name。如果指定filegroup_name和filegroup_property ,则表示给定文件组属性将应用于此文件组。
filegroup_property的值请参见表7.1。
表7.1 MODIFY FILEGROUP子句中filegroup_property的值
值 | 描述 |
READONLY | 指定文件组为只读。不允许更新其中的对象。主文件组不能设置为只读。只有具有排它数据库访问权限的用户才能将文件组标记为只读 |
READWRITE | 逆转READONLY属性。允许更新文件组中的对象。只有具有排它数据库访问权限的用户才能将文件组标记为读/写 |
DEFAULT | 将文件组指定为默认数据库文件组。只能有一个数据库文件组是默认的 |
● 数据库排序规则;COLLATE<collation_name>子句指定数据库的排序规则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规则名称。如果没有指定排序规则,则将SQL Server实例的默认排序规则指派为数据库的排序规则。
● 设置选项。SET子句用来设置修改数据库的选项。这些选项可以分为以下几类:
口 状态选项<state_option>:控制用户对数据库的访问,数据库是否处于联机状态,以及是否允许写操作;
口 控制游标选项<cursor_option>;
口 控制自动选项<auto_option>;
口 控制ANSI遵从性选项<sql_option>;
口 控制数据库恢复选项<recovery_options>。
SET选项的描述如表7.2所示。
表7.2 SET子句的选项
分类 | 选项 | 描述 |
状态选项 | SINGLE_USER | 同一时间只能有一个用户访问数据库 |
状态选项 | RESTRICTED_USER | 只有db _owner、 dbcreator或sysadmin角色的 成员可以使用数据库 |
状态选项 | MULTI_USER | 使数据库返回到正常操作状态 |
状态选项 | OFFLINE | 控制数据库是脱机 |
状态选项 | ONLINE | 控制数据库是联机 |
状态选项 | READ_ONLY | 在只读模式下,用户可以从数据库中读取数据,但不能修改数据。当指定READ_ONLY时,数据库不能处于使用状态 |
状态选项 | READ_WRITE | 使数据库返回到读写操作状态 |
控制游标选项 | CURSOR_CLOSE_ON_COMMIT ON|OFF | 如果指定为ON,在事务提交或回滚时所有打开的游标都将关闭。如果指定为OFF,那么在事务提交时打开的游标仍保持打开;而回滚事务时关闭所有除定义为INSENSITIVE或STATIC之外的游标 |
控制游标选项 | CURSOR_DEFAULTLOCAL| GLOBAL | 控制游标作用域默认为LOCAL还是GLOBAL |
控制自动选项 | AUTO_ CLOSE ON|OFF | 如果指定为ON,那么最后一个用户退出后,数据库将干净地关闭,其占用的资源将释放。如果指定为OFF,那么最后一个用户退出后数据库仍保持打开 |
控制自动选项 | AUTO_CREATE _STATISTICS ON|OFF | 如果指定为ON,那么所有优化查询需要但缺少的统计信息都会在查询优化时自动生成 |
控制自动选项 | AUTO_SHRINK ON|OFF | 如果指定为ON,数据库文件将定期自动收缩 |
控制自动选项 | AUTO_UPDATE_STATISTICS ON| OFF | 如果指定为ON,所有查询优化所需的过时的统计信息在都将在优化时自动重建。如果指定为OFF,统计信息必须手工更新 |
控制人NSI遵从 性选项 | ANSI_NULL_DEFAULT ON|OFF | 如果指定为ON,CREATE TABLE在确定列是 否允许空值时遵从SQL-92规则 |
控制ANSI遵从 性选项 | ANSI_ NULLS ON| OFF | 如果指定为ON,所有与空值的比较运算结果为UNKNOWN.如果指定为OFF,非UNICODE值与空值的比较运算在两者均为NULL时结果为TRUE |
控制ANSI遵从 性选项 | ANSI_WPADDING ON|OFF | 如果指定为ON,在比较或插入前,字符串将填充为同一长度。如果指定为OFF,字符串将不填充 |
控制ANSI遵从 性选项 | ANSI _WARNINGS ON|OFF | 如果指定为ON,当出现诸如被零除的情况时将产生错误或警告 |
控制ANSI遵从 性选项 | ARITHABORT ON|OFF | 如果指定为ON,在执行查询时如果发生溢出或被零除,该查询将终止 |
控制ANSI遵从 性选项 | CONCAT_NULL_YIELDS_NULL ON|OFF | 如果指定为ON,当串联操作的两个操作数中任意一个为NULL时,结果也为NULL.如果指定为OFF,空值将按空字符串对待。默认设置为OFF |
控制ANSI遵从 性选项 | QUOTED_ IDENTIFIER ON|OFF | 如果指定为ON,双引号将可用于包含定界标识符 |
控制人NSI遵从 性选项 | NUMERIC _ROUNDABORT ON| OFF | 如果指定为ON,当表达式中出现精度损失时将产生错误 |
控制ANSI遵从 性选项 | RECURSIVE_TRIGGERS ON| OFF | 如果指定为ON,将允许递归激发触发器。 RECURSIVE TRIGGERS OFF(默认值)只禁止直接递归。若要也禁用间接递归,请使用sp_configure将nested triggers服务器选项设置为0 |
控制数据库恢复选项 | RECOVERY FULL | 系统将对介质错误提供完全保护。如果数据文件损坏,介质恢复可以还原所有己提交的事务 |
控制数据库恢复选项 | RECOVERY BULK_LOGGED | 将在介质错误保护程度与某些大规模或大容量操作的最优性能及日志存储空间最少占用量之间进行权衡 |
控制数据库恢复选项 | RECOVERY SIMPLE | 系统将提供占用日志空间最小的备份策略。服务器故障恢复不再需要的日志空间可被自动重用。简单恢复模型比其他两种模型更容易管理,但数据文件损坏时造成数据丢失的可能性更大 |
控制数据库恢复选项 | TORN_PAGE_DETECTION ON|OFF | 如果指定为ON,将可以检测到未完成的页。默认设置为ON |
7.1.3删除数据库语句DROP DATABASE
DROP DATABASE语句从SQL Server中删除一个或多个数据库。删除数据库将删除数据库所使用的数据库文件和磁盘文件。
DROP DATABASE语句的语法结构如下:
DROP DATABASE database_name[,…n]
database_name指要删除的数据库名称。可以同时删除多个数据库。
例如,要将数据库Archive删除,可以执行以下命令:
DROP DATABASE Archive
GO
运行结果为:
正在删除数据文件’c:\program files\Microsoft sql server\mssql\data\archlog3.ldf’ 。
正在删除数据文件’c:\program files\Microsoft sql server\mssql\data\archlog2.ldf’ 。
正在删除数据文件’c:\program files\Microsoft sql server\mssql\data\archlog3.ldf’ 。
正在删除数据文件’c:\program files\Microsoft sql server\mssql\data\archlog2.ldf’ 。
正在删除数据文件’c:\program files\Microsoft sql server\mssql\data\archlog1.ldf’ 。
正在删除数据文件’c:\program files\Microsoft sql server\mssql\data\archlog1.ldf’ 。
体现了删除数据库文件的过程。
7.1.4分离数据库语句sp_detach_db
sp _detach_db实际上是一个存储过程,它的功能是从服务器分离数据库。Sp_detach_db语向的语法结构如下:
sp_detach_db[@dbname]= ‘dbname’
[,[@skipchecks=]’skipchecds’]
参数说明如下:
● [@dbname =] ‘dbname’ 。表示要分离的数据库名称。dbname的数据类型为sysname,
默认值为NULL。
●「 @skipchecks=〕’sldpchecks’。定义是否执行UPDATE STATISTICS。sldpchecks
文章评论