1.嵌入式SQL
SQL语言提供了两种不同的使用方式:
交互式
嵌入式
嵌入式SQL的处理过程
主语言
嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言称为宿主语言,简称主语言。
处理过程
预编译方法
若主语言为Java,则嵌入式sql称为SQLJ,语法格式为:
#sql{<SQL语句>};
2.T-SQL基础
变量
变量是被赋予一定的值的语言元素。
T-SQL语言中有两种形式的变量:
- 用户自己定义的局部变量;用户用于保存特定类型的单个数据值的对象。
- 系统提供的全局变量。
局部变量
局部变量的作用范围仅限制在程序内部。被引用时在其名称前加标志”@”,且先要用DECLARE命令定义。语法格式如下:
DECLARE {@local_variable data_type} [,...n]
参数@local_variable指定局部变量的名称,参数data_type设置局部变量的数据类型和大小(不可以是text、ntext或image数据类型)。
使用declare声明并创建局部变量后,其初始值为null,如果想要设定值,必须使用select或set命令。形式为:
set{@local_variable=expression}
或者
select{@local_variable=expression}[,...n]
expression是任何有效的SQL Server表达式。
全局变量
全局变量是SQL Server系统内部使用的变量,任何程序块都可以调用。通常存储一些配置设定值和统计数据。
使用全局变量应注意以下几点:
1.全局变量不是由用户的程序定义的,它们是在服务器级定义的。
2.用户只能使用预先定义的全局变量。
3.引用全局变量时,必须以“@@”开头。
4.局部变量不能与全局变量同名。
例:局部变量引用出错的演示
局部变量的作用域,只能在声明它的批处理内部。一但批处理消失,局部变量也将自动消失。
declare @dispstr varchar(20)
set @dispstr='这是一个局部变量引用出错的演示'
go
--批处理在这里结束,局部变量被清除
print @dispstr
go
语句批
- 一组SQL语句的集合;
- 执行计划中的语句每次执行一条;
- 结束标记:go。
流程控制语句
begin…end语句块
begin
语句1或语句块1
语句2或语句块2
...
end
if…else语句
if 逻辑表达式
{语句1或语句块1}
[else
{语句2或语句块2}]
多分支语句
搜索case表达式
case
when 布尔表达式1 then 结果表达式1
when 布尔表达式2 then 结果表达式2
...
[else 结果表达式n+1]
end
特点:
1.case关键字的后面没有任何表达式;
2.when后面都是布尔表达式。
执行过程:
1.从上到下;
2.返回第一个取值为true的布尔表达式所对应的结果表达式的值。若没有取值,参照else。
简单case表达式
case 测试表达式
when 简单表达式1 then 结果表达式1
when 简单表达式2 then 结果表达式2
...
[else 结果表达式n+1]
end
while语句
WHILE…CONTINUE…BREAK语句用于设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。其中,CONTINUE语句可以使程序跳过CONTINUE语句后面的语句,回到WHILE循环的第一行命令。BREAK语句则使程序完全跳出循环,结束WHILE语句的执行。
语法形式:
WHILE Boolean_expression
statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
3.函数
常用的函数包括:系统函数、字符串函数、日期和时间函数、数学函数、转换函数。除此之外,用户还可以根据自己需要利用CREATE FUNCTION命令创建函数。
数学函数
数学函数通常对输入的数字参数执行某些特定的数学计算,并返回运算结果。
数学函数可以对SQL Server提供的数字数据(decimal、integer、float、real、money、smallmoney、 smallint和 tinyint)进行处理。
字符串函数
字符串函数主要用于char、varvhar数据类型。可以在SELECT语句的SELECT和WHERE子句以及表达式中使用字符串函数。
转换函数
当SQL 系统不能自动转换或自动转换的结果不符合要求时,就需要借助转换函数来实现,这种转换称为显示转换。
常用的转换函数主要包括CONVERT和CAST。
利用CAST函数可以将某一个数据类型强制转换为另一种数据类型,其语法格式如下:
CAST(expression AS data_type)
CONVERT函数允许用户把表达式从一种数据类型转换为另一种数据类型,并且还在日期的不同显示格式之间进行转换,其语法格式如下:
CONVERT(data_type[(length)],expression[,style])
说明:
data_type:需要转换的类型
length:转换结果的长度
expression:需要转换的表达式
Style:要转换成的表达式类型
日期时间函数
日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串、数字值或日期和时间值。
系统函数
COL_NAME::返回表中指定字段的名称,即列名。
COL_LENGTH:返回指定字段的长度值。
DB_ID:返回数据库的编号。
DB_NAME:返回数据库的名称。
DATALENGTH:返回任何数据表达式的实际长度。
HOST_ID:返回服务器端计算机的ID号。
HOST_NAME:返回服务器端计算机的名称。
ISDATE:检查给定的表达式是否为有效的日期格式。
ISNULL:用指定值替换表达式中的指定空值。
NULLIF:如果两个指定的表达式相等,则返回空值。
OBJECT_ID:返回数据库对象的编号。
OBJECT_NAME:返回数据库对象的名称。
SUSER_SID:返回服务器用户的安全帐户号。
SUSER_NAME:返回服务器用户的登录名。
USER_ID:返回用户的数据库ID号。
USER_NAME:返回用户的数据库用户名。
用户自定义函数
语法形式如下:
CREATE FUNCTION [schema_name.]function_name
([{@parameter_name [AS] parameter_data_type [=default]}[,...n]])
RETURNS return_data_type
[AS]
BEGIN
function_body
RETURN expression
END
创建表值函数
表值函数返回一个表作为输出。在RETURNS子句中定义函数要返回的类型为table,在RETURN子句中给出函数要返回的一个直接select语句结果集或一个临时表中的数据。
内联表值函数
函数直接返回一个select语句的结果集。并且在内联函数中不使用BEGIN和END语句包含函数体,直接使用RETURN子句返回一个select语句的结果集或多个select语句的集合运算,结构比较简单。
语法形式如下:
CREATE FUNCTION [schema_name.]function_name
([{@parameter_name [AS] parameter_data_type [=default]}[,...n]])
RETURNS TABLE
[AS]
RETURN (select-stmt)
select-stmt:函数返回值的单个查询语句。
多语句表值函数
函数返回一个临时表作为输出。在函数的RETURNS子句中首先创建一个临时表,然后在BEGIN和END定义的函数体中可以通过多条语句向临时表中插入值,并将临时表中的数据作为返回结果。
创建多语句表值函数的语法形式如下:
CREATE FUNCTION [schema_name.]function_name
([{@parameter_name [AS] parameter_data_type [=default]}[,...n]])
RETURNS @return_variable TABLE <table_type_definition>
[AS]
BEGIN
function_body
RETURN
END
:定义表数据类型。包括列的定义和约束。
调用自定义函数
语法形式 :
在调用用户自定义函数,如果调用的是标量函数,则必须提供架构名。其语法格式为:
schema_name.function([argument_expr][,…])
argument_expr:表示实际参数值。
如果调用的是表值函数,则可以不提供架构名。
用户可以将调用的函数用在赋值语句中,或作为表达式的操作数,或用在SQL命令中。
删除自定义函数
语法形式:
用户使用DROP FUNCTION命令可以删除函数,其语法形式如下:
DROP FUNCTION { [ schema_name. ] function_name } [ ,...n ]
4.存储过程
存储过程的基本概念
SQL Server的存储过程类似于编程语言中的过程。在使用Transact-SQL语言编程的过程中,可以将某些多次调用以实现某个特定任务的代码段编写成一个过程,将其保存在数据库中,并由SQL Server服务器通过过程名调用它们,这些过程就叫做存储过程。
存储过程可以实现:
接受输入参数并以输出参数的形式将多个数据值返回给调用过程或批处理。
包含用于在数据库中执行操作(包括调用其他过程)的各种语句。
向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。
存储过程的分类
存储过程主要分为:系统存储过程和用户定义的存储过程。
系统存储过程
由SQL Server 提供,用户可以直接使用。SQL Server 中的许多管理活动都是通过一些系统存储过程完成的。
系统存储过程存放在“master”数据库中。它们主要用于系统管理、用户登录管理、权限设置、数据库对象管理、数据复制等操作。
用户定义的存储过程
用户自定义存储过程用于实现用户自己所需要实现的操作。
存储过程的优点
- 预编译:存储过程预先编译好放在数据库内,减少编译语句所花的时间。
- 存储过程内可引用其他存储过程,可以简化一系列复杂语句。
- 可以减少网络通信流量。一个需要数百行T-sql语句的操作由一条执行过程代码的单独语句实现。
- 执行速度快。编译好的存储过程会进入缓存,对经常执行的存储过程,除第一次执行以外,其他次执行速度明显提高。
- 可以作为一种安全机制。
创建存储过程
在SQL Server中,可以使用“SQL Server Management Studio”界面操作和Transact_SQL语句实现存储过程的创建。默认情况下,创建存储过程的许可权归属数据库的所有者,数据库的所有者可以授权给其他用户。
CREATE PROC[ EDURE ] 存储过程名
[ { @参数名 数据类型 } [ = default ] [OUTPUT]
] [ , ... n ]
AS
SQL语句 [ ... n ]
default:表示参数的默认值。如果定义了默认值,则在执行存储过程时,可以不必指定该参数的值。
OUTPUT:表明参数是输出参数。使用 OUTPUT 参数可将信息返回给调用者。
[ EXEC [ UTE ] ] 存储过程名
[实参 [, OUTPUT] [, … n] ]
查看已定义的存储过程
展开要查看存储过程的数据库,然后顺序展开“可编程性”->“存储过程”。
在某个存储过程上右击鼠标,在弹出的菜单中选择“修改”命令,可以查看定义该存储过程的代码。
修改存储过程的语句为:
ALTER PROC [ EDURE ] 存储过程名
[ { @参数名 数据类型 } [ = default ] [OUTPUT]
] [ , ... n ]
AS
SQL语句 [ ... n ]
删除存储过程
用图形化方法删除:在要删除的存储过程上右击鼠标,在弹出菜单中选择“删除”命令;
用T-SQL语句删除:
DROP { PROC | PROCEDURE }
{ procedure } [ ,...n ]
5.游标
关系数据库中的操作会对整个行集产生影响。使用SELECT语句能返回所有满足条件的行,这一完整的行集被称为结果集。但是在实际开发应用程序时,往往需要每次处理结果集中的一行或一部分行。游标是提供这种机制的结果集的扩展。
游标是一种数据结构。通过这种结构,程序可以将查询结果保存在其中,并可对其中某行(或某些行)的数据进行操作。
游标中的数据保存在内存中,从其中提取数据的速度要比从数据表中直接提取数据的速度要快得多。
请求游标
- T-SQL
- 应用程序编程接口(API)游标函数。
(1)ADO
(2)OLE DB
(3)ODBC
使用游标
声明游标
DECLARE 游标名[insensitive][scroll] CURSOR
FOR SELECT 语句
[for{read only|update [of<列名>[,…,n]]}]
INSENSITIVE表明 SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。
当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。
a.在SELECT 语句中使用DISTINCT、 GROUP BY、 HAVING UNION 语句;
b.使用OUTER JOIN;
c.所选取的任意表没有索引;
d.将实数值当作选取的列。
SCROLL表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再重开游标。
READ ONLY:禁止通过该游标进行更新。
UPDATE [OF column_name [,…n]:定义游标中可更新的列
select_statement是定义结果集的Select 语句。
打开游标
OPEN 游标名
功能:
打开已经定义还没有打开的游标,执行该语句意味着执行在DECLARE CURSOR 语句中定义的SELECT查询,并使游标指针指向查询结果的第一条记录。
提取游标
FETCH [ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
游标名
[ INTO @variable_name [,...n ] ]
NEXT:如果是在OPEN后第一次执行FETCH命令,则返回结果集的第一行,否则使游标指针指向结果集的下一行;NEXT是默认选项,也是常用的一种方法。
@@FETCH_STATUS
可以使用@@FETCH_STATUS全局变量判断数据提取的状态。
@@FETCH_STATUS返回 FETCH 语句执行后的游标最终状态。
返回值 | 含义 |
---|---|
0 | fetch语句成功 |
-1 | fetch语句失败或此行不在结果集中 |
-2 | 被提取的行不存在 |
关闭游标
CLOSE 游标名
在使用CLOSE语句关闭某游标后,系统并没有完全释放游标的资源,并且也没有改变游标的定义,当再次使用OPEN语句时可以重新打开此游标。
释放游标
DEALLOCATE 游标名
释放游标就释放了与该游标有关的一切资源,包括游标的声明,以后就不能再使用OPEN语句打开此游标了。