2023年6月21日发(作者:)

引 言

本专刊主要针对于刚刚加入用友维护队伍、希望快速提高个人面向U8软件维护工作的SQLServer应用能力的人员而编写,特别适用于SQLServer初学者。

注意:本专刊是为SQLServer快速入门而编写,内容简单概括,读者要使自己的SQLServer水平有质的提高,在实际工作中要充分利用SQLServer联机帮助,它是最具权威的参考资料。

本专刊主要内容:

第一章 概述U8数据库特点、常用的SQL工具、语法格式,以及SQLServer数据库中的一些常用的术语。

第二章和第三章主要介绍SQL的基础、高级应用。

第四章 简要介绍事件探查器的使用。事件探查器是U8维护工作中最为常用的分析工具。

附录 内容包括组成数据库对象的概念、SQLSERVER的系统组成以及Transact_SQL小手册,可以作为查询SQLServer信息的快速参考。

2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第2页 共58页

信息反馈:

由于时间和水平有限,不当之处和错误在所难免,如果在阅读中发现本专刊有错误之处,恳请读者批评指正!

如果读者对本刊的编制或SQLServer学习方面有好的意见或建议,敬请email至如下地址:

陈 媛 cheny@

陈湘林 gccxl@

马大刚 mdg@

致谢:

本期SQLServer专刊是在两期新员工、部分分公司维护人员进行的SQLServer培训的基础上整理而成。参与培训人员对本专刊的编制提供了很多有益的意见和建议,在这里对他们积极支持和配合(特别是新员工李丹,对最后定稿的排版、勘误做了大量工作)致以衷心的感谢!

第 2 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第3页 共58页

目 录

第一章 概述 ......................................................................................... 4

第一节

U8数据库简述 .................................................................... 4

第二节

常用的SQL工具简介 ......................................................... 6

第三节

数据库中的常用术语和概念 .............................................. 8

第四节

SQL语法格式说明.............................................................. 9

第二章 SQL基础应用 ....................................................................... 11

第一节

简单的SELECT查询 ....................................................... 12

第二节

SELECT语句中的常用子句及函数 ................................... 12

第三节

连接(JOIN)语句 ............................................................. 14

第四节

数据操作语句 .................................................................... 19

第五节

SELECT子查询语句 ........................................................... 20

第三章 SQL高级应用 ....................................................................... 23

第一节

创建、删除数据库和表 .................................................... 23

第二节

创建视图和索引 ................................................................ 24

第三节

创建和执行存储过程、触发器和游标 ............................ 26

第四节

系统存储过程、系统表 .................................................... 30

第四章 事件探查器 ........................................................................... 33

第一节

创建跟踪 ............................................................................ 33

第二节

事件探查器的精确跟踪 .................................................... 39

第三节

实际工作中事件探查器的应用 ........................................ 40

附录: ................................................................................................... 42

第 3 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第4页 共58页

第一章 概述

SQL(Structured Query Language,结构化查询语言)是一种现今流行的数据库语言,目前主流的数据库产品都支持这种语言,如常见的Microsoft Access、Microsoft SQLServer、Oracle、Sybase、MySQL等,并且这些数据库产品都不同程度上对标准的SQL进行了扩展,以使SQL应用更为高效。

用友产品以Microsoft Access(如8.12A版本)或MicrosoftSQLServer(如U8以上版本)作为后台数据库,目前(8.x、U8)不支持其他的数据库产品。

第一节 U8数据库简述

1.1 U8数据库

用友U8系列产品的后台数据库是采用Microsoft SQLServer。

U8系列产品的数据库按功能主要可分为三类:

A.系统数据库UFSystem;

B.账套数据库UFData_xxx_xxxx(如UFData_999_2003,其中999表示账套号,2003表示会计年度);

C.模板数据库UFModel。

其中UFSystem库用于存储一些公共系统信息,如操作员信息、账套系统信息等,UFData_xxx_xxxx库用于存储账套数据,UFModel

第 4 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第5页 共58页库在新建账套时作为模板数据库使用。

每个SQLServer数据库是由两类文件组成:一类是数据文件,包括主数据文件(扩展名为mdf)和次要数据文件(扩展名为ndf,该类文件不是必须的,U8数据库通常没有该文件);一类是日志文件(扩展名为ldf)。

1.2 8.X数据库

用友早期产品以Access为后台数据库,这些产品(如8.12A)目前仍有很多用户在使用。

大部分8.X产品的系统库和账套数据库都是Access数据库类型。

每个Access数据库只对应一个文件,以mdb为扩展名。

以Access为后台数据库的产品,用Access软件可以直接打开对应的数据库文件,该数据库文件可以作为参考的数据字典使用(点击每个表的设计模式,内有详尽的字段含义解释)。

另外,以Access为后台数据库的产品安装盘中有压缩的演示账套数据库文件,直接用Winzip解压缩后,手工将该文件扩展名更改为以.mdb为结尾,就可以作为参照的数据字典使用。

1.3 SQLServer和MSDE的关系

MSDE是SQLServer的一个简版,该版本是免费使用的,功能和SQLServer基本相同,只是在多用户条件下运行效率低于SQLServer产品,而且,MSDE本身没有一个可视化的操作界面,只是在后台运行,不过,SQLServer等数据库软件仍可以在远程访问控制该数据库。

虽然用友支持SQLServer的产品也支持MSDE,但用友产品需要的某些数据库高级功能则要求用户必须使用SQLServer作为后台数据库(如数据库的数据抽取功能)。而且在实际的维护实践中,也

第 5 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第6页 共58页会发现,MSDE出现异常的情况远多于SQLServer。所以,在维护中如果遇到以MSDE作为后台数据库的情况应多加注意此方面的问题。

1.4 Microsoft SQLServer、MSDE与Access数据库的比较

Microsoft SQLServer和MSDE支持的功能远多于Access,Access通常不支持SQL的高级功能,如:存储过程、触发器等。

Microsoft SQLServer配有强大的辅助工具,特别是事件探查器工具,而Access产品没有实现此类功能的工具。另外,Access的产品的安全性也远低于SQLServer产品。

第二节 常用的SQL工具简介

SQL本身是一种语言,需要在特定的环境中运行。U8产品的Microsoft SQLServer、MSDE以及8.12A产品的Access都为SQL提供了运行环境。

为了使8.X、U8系列产品正常运行,必须要先安装好对应的后台数据库产品(关于Microsoft Access和Microsoft SQLServer如何安装,请参阅安装盘帮助文件)。

2.1 Microsoft SQLServer

SQLServer中常用的工具包括:企业管理器、查询分析器、事件探查器等。如图1所示:

第 6 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第7页 共58页图1

企业管理器:可进行各种可视化的操作,功能强大,但由于其运行时消耗资源较大,所以当计算机硬件条件不好或者SQLServer负载太大时,会有操作反映迟钝等问题。

查询分析器:是交互式图形工具,它使数据库管理员或开发人员能够编写查询、,同时执行多个查询、,查看结果、,分析查询计划和获得提高查询性能的帮助。

事件探查器:是图形工具,使系统管理员得 以监视 Microsoft® SQL

Server™ 实例中的事件。可以捕获有关每个事件的数据并将其保存到文件或 SQL Server 表中供以后分析。

2.2 Microsoft Access

快捷方式如图1所示。

第 7 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第8页 共58页第三节 数据库中的常用术语和概念

本节主要介绍一些常用的SQLServer术语和概念,更多术语请参考联机帮助中的“词汇表”内容,查询位置如图2所示。

图2

数据库 (database) :为特定目的(如搜索、排序和重新组织数据)而组织和提供的信息、表和其它对象的集合。数据库存储在文件中。如:UFData_999_2003就是一个数据库。

表 (table) :一种二维数据对象,由行和列组成,用于存储关系数据库中的数据。每个表存储有关由数据库建模的一类对象的信息。例如,某个教育数据库将具有一个教师表、一个学生表和一个课程表。

第 8 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第9页 共58页

字段 (field) :存储单个数据值的窗口或记录中的某个区域。某些数据库(如 Microsoft Access)将字段用作列的同义词。如Accinformation表中的cSysID字段。

记录 (record) :视作一个单元信息的一组相关字段(列)。在 SQL

数据库中记录更经常被称作行。

第四节 SQL语法格式说明

在SQLServer联机帮助中,可看到如下语句语法:

SELECT [ ALL | DISTINCT ]

[ TOP n [ PERCENT ] [ WITH TIES ] ]

< select_list >

< select_list > ::=

{ *

| { table_name | view_name | table_alias }.*

| { column_name | expression | IDENTITYCOL |

ROWGUIDCOL }

[ [ AS ] column_alias ]

| column_alias = expression

} [ ,...n ]

如何理解上句中的各种符号的涵义呢?在联机帮助中搜索“Transact-SQL 语法规则”,会找到如图3所示内容,其中包含了详细的SQL语法符号的具体涵义。

第 9 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第10页 共58页图3

本章小结:

本章只是简要介绍了一些比较基础的术语和概念,目的是使读者对SQLServer有个总体的印象,以便能有效的进行后续的学习。更多的内容还请参阅联机帮助。

第 10 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

第二章 SQL基础应用

页码:第11页 共58页 让我们从Select语句开始对SQL语法的学习。本专刊中所使用的SQL语句均在SQLServer查询分析器中执行。对SQL语言的学习,关键是要边学习边实践,读者可以在SQLServer查询分析器中实际练习本专刊提供的语句。

Select语句的功能为从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列,该语句包含众多的子句,功能强大,使用灵活。

下面先简要说明在SQLServer查询分析器中执行SQL语句的步骤:

第一步:运行查询分析器,如图3所示:

图3

第二步:执行选中待操作的数据库语句。如图3所示:选中use

ufdata_887_2004后,点击绿色箭头(或直接按F5)执行,该语句中,use为连接目标数据库的SQL关键字,ufdata_887_2004是要进行相应操作的目标数据库。

第三步:执行相应的SQL语句(如图3中的select * from

第 11 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第12页 共58页accinformation语句)。

第一节 简单的SELECT查询

在SQLServer的查询分析器中执行如下两句SQL语句:

USE Northwind

SELECT *

FROM [Order Details]

执行该语句返回Order Details表中包含所有列的记录。这两句SQL语句也可以合并为一条语句:

SELECT * FROM Northwind..[Order Details]

Northwind..[Order Details]表示 [Order Details] 表是Northwind数据库中的表,使用这种形式,就不用再提前连接数据库了(即不用使用use语句来连接数据库)。

注意:由于上面语句中表名Order Details两个单词之间存在空格,所以使用中括号,如果表名中不存在空格,如表名为Orderdetails,则中括号可以省略。

第二节 Select语句中的常用子句及函数

2.1 SQL中函数的使用

在SQL 中的函数可以执行一些储如对某一列进行汇总或将一个字符串中的字符转换为大写的操作。比较常用的函数有聚合函数、日期与时间函数、数学函数、转换函数和字符函数等,具体内容参见附录。在这里以一个最常用的聚合函数为例。

第 12 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第13页 共58页sum()就如同它的本意一样,返回某一列的所有数值的和。可以到查询分析器中执行如下语句(求数量的总和):

SELECT sum(quantity) FROM Northwind..[Order Details]

注意:此处必须指定要合计的具体列而不能使用*,并且该列必须是数值型。

2.2 Select语句的常用子句

Select中的常用子句包括:Where,Order By,Group by,Having,Join等。Join语句会在第三节重点讲解。本节主要讲解前四个子句的用法。

2.2.1 Where子句

Where子句的作用是指定查询返回行的条件。如:返回Northwind数据库中Order Details表中的数量(quantity)字段值大于100的记录,SQL语句可写为:

SELECT * FROM Northwind..[Order Details] Where quantity>100

2.2.2 Order By子句

Order By子句是用来指定在 SELECT 语句返回的列中所使用的排序次序。如:根据某一列排序(如OrderID列),SQL语句可写为:

USE Northwind

SELECT * FROM [Order Details] ORDER BY OrderID

2.2.3 Group By子句

Group By子句主要和函数连用(如sum函数),按指定列汇总。如:返回Northwind数据库中Order Details表中,productID字段相同的数量之和,SQL语句可写为:

第 13 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第14页 共58页SELECT ProductID, sum(quantity) FROM Northwind..[Order

Details] Group By ProductID

2.2.4 Having子句

Having子句一般要和GROUP BY 子句连用。如:上句中要再加一个条件,数量之和大于1000的返回记录,SQL语句可写为:

SELECT ProductID, sum(quantity) FROM Northwind..[Order

Details] Group By ProductID Having sum(quantity)>1000

2.2.5 Where子句和Having子句的区别

Where子句和Having子句的主要区别:和Group By连用时,Where后面的条件是先排除再进行Group By汇总;而Having是在Group By汇总后,再用后面的条件进行筛选。另外Having语句后的条件可以是聚合函数(如sum函数、Max函数),而where后不能接聚合函数。如下面的语句:

SELECT ProductID, sum(quantity) FROM Northwind..[Order

Details] Group By ProductID Having sum(quantity)>1000

如果用Where语句后加相同筛选条件则无法实现目标功能。

第三节 连接(Join)语句

Join子句的主要作用,就是将两个表横向连接起来。Join分为内连接和外连接。内连接为[Inner] Join(默认形式,Inner可以省略);外连接分为三个Left Outer Join、Right Outer Join、Full Outer Join(其中的Outer可以省略)。

下面举一个例子来说明Join子句的用法。有两个表father和son结构如下(其中father表的Fid字段和Son表的Fid字段是对应的):

第 14 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第15页 共58页father表

Fid

1

2

3

Son表

Sid

1

2

3

4

5

6

Name

Ason1

Ason2

Ason3

Cson1

Cson2

Dson1

Fid

1

1

1

3

3

4

Name

A

B

C

3.1 使用内连接语句Inner Join连接

Inner Join返回两个表中匹配的行。两个表中不匹配的行不在结果中显示。如果未指定联接类型,则该连接形式为默认形式。

在SQLServer查询分析器中执行如下语句:

Select * From father Join son On =

结果如下:

1

2

3

4

5

Fid

1

1

1

3

3

Name

A

A

A

C

C

Sid

1

2

3

4

5

Name

Ason1

Ason2

Ason3

Cson1

Cson2

Fid

1

1

1

3

3

第 15 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第16页 共58页

3.2 使用左连接语句Left Outer Join连接

Left Outer Join指定在结果集中除包含左右表中匹配的数据外,还返回左表中所有不满足联接条件的行,且右表中相应字段值为 NULL。其中Outer可以省略,但Left和Join关键字不可省略。

在SQLServer查询分析器中执行如下语句:

Select * From father Left Join son On =

结果如下(注意下表中的NULL):

1

2

3

4

5

6

Fid

1

1

1

2

3

3

Name

A

A

A

B

C

C

Sid

1

2

3

NULL

4

5

Name

Ason1

Ason2

Ason3

NULL

Cson1

Cson2

Fid

1

1

1

NULL

3

3

在SQLServer查询分析器中执行如下语句:

Select * from father left join son on = where

is null

实现的功能为:找出在father表中有,而在son表中没有对应的记录。

3.3 使用右连接语句Right Outer Join连接

Right Outer Join语句和Left Outer Join 语句的用法原理相同。Right Outer Join语句是在结果集中除包含左右表中匹配的数据外,还返回右表中所有不满足联接条件的行,且左表中相应字段值为 NULL。其中Outer可以省略,但Right和Join关键字不可省

第 16 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第17页 共58页略。

在SQLServer查询分析器中执行如下语句:

Select * From father Right Join son On =

结果如下(注意下表中的NULL):

1

2

3

4

5

6

Fid

1

1

1

3

3

NULL

Name

A

A

A

C

C

NULL

Sid

1

2

3

4

5

6

Name

Ason1

Ason2

Ason3

Cson1

Cson2

Dson1

Fid

1

1

1

3

3

4

在SQLServer查询分析器中执行如下语句:

Select * from father Right join son on = where

is null

实现的功能为:找出在Son表中有,而在father表中没有对应的记录。

3.4 使用全连接语句Full Outer Join连接

Full Outer Join是指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。其中Outer可以省略,但Full和Join关键字不可省略。

在SQLServer查询分析器中执行如下语句:

Select * From father Full Join son On =

结果如下(注意下表中的NULL):

Fid Name Sid Name Fid

第 17 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

1

1

1

3

3

NULL

2

A

A

A

C

C

NULL

B

1

2

3

4

5

6

NULL

Ason1

Ason2

Ason3

Cson1

Cson2

Dson1

NULL

页码:第18页 共58页1

2

3

4

5

6

7

1

1

1

3

3

4

NULL

在SQLServer查询分析器中执行如下语句:

Select * from father Full join son on = where

is null Or is null

实现的功能为:找出在Son表中有,而在father表中没有对应的记录以及在Father表中有,而在son表中没有对应的记录。

3.5 Join子句小结

在U8产品中,大量使用了Inner Join、Left Join、Right Join和Full Join子句。

Join语句以其灵活的应用方式,可以方便的实现各种的复杂查询功能。有些简单的功能也能用另外的一个子句:IN子句可以实现,但IN子句实现的功能要比Join语句简单很多。因此一定要重点学习Join语句的各种灵活使用的方法。

In子句会在Select语句子查询语句中讲解。

3.6 Union子句的用法

Join子句是用来将两个表横向连接起来组成一个新表,而Union子句是将两个表纵向连接起来组成一个新表。

当然,Union纵向连接两个表是有限制条件的:两个表的列数相等,且对应列的类型兼容(可以简单的理解为类型相同)。

第 18 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第19页 共58页具体的Union语法请查询联机帮助。

第四节 数据操作语句

数据操作语句包括INSERT、 UPDATE 和DELETE 等

4.1 插入Insert Into子句使用方法

可以使用 INSERT INTO 在当前表中创建新行。

在SQLServer查询分析器中执行如下语句:

INSERT itles

(title_id, title, type, pub_id, price)

VALUES ('BU9876', 'Creating Web Pages', 'business',

'1389', 29.99)

type、 pub_id、 price是目标数据表的列名字,Values关键字后面是要插入对应列的具体数据。

4.2

DELETE删除子句使用方法

DELETE从表中删除行。为了尽可能的减少误操作最好在执行delete语句之前,先执行对应的select语句,以确定Where后面条件的准确性。

在SQLServer查询分析器中执行如下语句(删除刚才插入的记录):

select * itles where title_id ='BU9876'

delete itles where title_id = 'BU9876'

4.3

UpDate子句使用方法

第 19 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第20页 共58页UPDATE子句是用于更改表中的现有数据。为了尽可能的减少误操作最好在执行UPDATE语句之前,先执行对应的select语句,以确定Where后面条件的准确性。

在SQLServer查询分析器中执行如下语句(更改刚才插入的记录,如果已经删除,请重新用Insert Into插入语句插入相应的数据):

select * itles where title_id ='BU9876'

itles set price = 200 where title_id

='BU9876'

4.4

Select Into子句使用方法

SELECT … INTO

new_table

From…子句创建新表并将查询的结果行插入新表中。

在SQLServer查询分析器中执行如下语句:

Select *

w_table1

itles

用语句Select * w_table1可以查询出刚才新生成的表及其中刚刚插入的数据。

注意:Select Into子句并不能将原来表的一些关系复制到新表中(如外键等),它只能插入相应的数据。所以要想既复制表关系又复制其中的数据,请使用SQLServer企业管理器中提供的导表功能。

第五节 Select子查询语句

5.1 子查询使用方法

第 20 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第21页 共58页子查询是一个 SELECT 查询,任何允许使用表达式的地方都可以使用子查询。

在SQLServer查询分析器中执行如下语句(一个子查询用作

SELECT 语句中名为 MaxUnitPrice 的列表达式):

SELECT D, ate,

(SELECT MAX(ice)

FROM .[Order Details] AS OrdDet

WHERE D = D) AS

MaxUnitPrice

FROM AS Ord

其中的As关键字用于指定别名。

5.2 In子句的使用方法

IN子句是确定给定的值是否与子查询或列表中的值相匹配。

下面的示例选择名称和州的列表,列表中列出所有居住在加利福尼亚、印地安纳或马里兰州的作者:

SELECT au_lname, state

FROM pubs..authors

WHERE state IN ('CA', 'IN', 'MD')

请参看“3.2 左连接语句Left Outer Join”的例子(找出在father表中有,而在son表中没有对应的记录):

Select * from father left join son on = where

is null

对等的In子句是(注意这个语句并没有将两个表横向连接起来,同时也用了子查询语句):

Select * from father where Not In (Select fid

from son)

第 21 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第22页 共58页

本章小结:

本章主要讲解了SQL语句的常用语法。Select语句及其子句灵活的语法是学习的难点,在U8维护工作中, Join子句是最为常用的语法,必须重点学习。

本专刊附录部分,详尽讲解了本章所涉及SQL语句一些较为高级灵活的用法,另外学习这些语法时,一定要结合SQLServer的联机帮助。

第 22 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第23页 共58页

第三章 SQL高级应用

有了SQL基础,本章开始讲解一些SQL的高级应用。包括如何创建数据库、表、索引,视图、存储过程、触发器、游标的简单应用等,同时本章也讲解一些能有效提高维护效率的SQL知识:系统存储过程、系统表的应用。

第一节 创建、删除数据库和表

1.1 创建、删除数据库的SQL语法

创建数据库的语法:create database 数据库名

在查询分析器中写:Create Database testData,选中该语句,按F5执行,创建了一个名字为testData的数据库。

删除数据库的语法:drop database 数据库名

在查询分析器中写:Drop Database testData,选中该语句,按F5执行,删除名字为testData的数据库。

1.2 创建、修改、删除数据库中表的SQL语法

创建表的语法:create table 表名

(

列名1 数据类型(长度) not NULL [NULL],

列名2 数据类型(长度) not NULL [NULL],

第 23 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第24页 共58页 ................

)

在查询分析器中写:

use testData

Create table testTable1

(

id int,

name varchar(20)

)

选中上面的SQL语句,按F5执行,创建一个名字为testTable1的表。

修改表的关键字是:Alter table(其后可能跟随ALTER COLUMN、ADD、DROP COLUMN等),具体语法可到SQLServer联机帮助中查询。

删除表的语法:Drop table 表名(可以一次性删除多个表,表名和表名之间用逗号隔开)。

在查询分析器中写:Drop table testTable1,选中该语句,按F5执行,删除名字为testTable1的表。

第二节 创建视图和索引

2.1 创建视图

CREATE VIEW是创建一个虚拟表,该表以另一种方式表示一个或多个表中的数据。CREATE VIEW 必须是查询批处理中的第一条语句。

创建视图的简单语法是:

CREATE VIEW 视图名

第 24 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第25页 共58页As

下面的示例为pubs库创建的名字为TestView的视图:

use pubs

go

Create View TestView

As

Select * from authors

视图的使用和表基本相同,如:

select * stview

2.2 删除视图

删除视图的语法为:

drop View 视图名

下面的示例为删除刚刚在pubs库的创建的视图:

USE pubs

drop view testview

2.3 创建索引

为给定表或视图创建索引。只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。

创建索引的简单语法是:

create [unique][clustered] index 索引名 on 表名(列[asc|desc])

下面的示例为pubs库的 authors 表的 au_id 列创建索引:

第 25 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

USE pubs

CREATE INDEX au_id_ind

ON authors (au_id)

页码:第26页 共58页2.4 删除索引

删除索引的语法为:

drop index 表名.索引名

下面的示例为删除刚刚在pubs库的 authors 表的 au_id 列创建的索引:

USE pubs

drop index _id_ind

2.5 视图和表的区别

视图和表的用法基本相同。但他们之间在作用上有很大区别的:视图是用来动态的创建一个表,它占用的数据库空间比较小(基本上就是一些SQL语句),但使用时的执行速度一般比表要慢一些;表的缺点就是比视图占用的数据库空间大,但执行速度比较快。另外视图是以表为基础的。

第三节 创建和执行存储过程、触发器和游标

3.1 创建存储过程

创建存储过程的关键字是Create Proc(也可以是create

procedure)

在SQLServer查询分析器中执行如下语句创建一个名字为testPro的存储过程:

use pubs

第 26 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第27页 共58页

go

create proc testProc

as

select * from authors

带参数存储过程的创建:

use pubs

go

create proc testProcX @name varchar(20)

as

select * from authors where au_lname = @name

执行存储过程

执行无参数存储过程的语句是:

stproc

执行带参数存储过程的语句是(注意参数的赋值):

stprocx @name='white'

删除存储过程

删除无参数和带参数的存储过程的语句分别是:

use pubs

drop proc testProc

use pubs

drop proc testprocX

3.2

3.3

3.4 创建触发器

CREATE TRIGGER是创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。

第 27 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第28页 共58页Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或

DELETE 语句创建多个触发器。

在pubs库中的titles表上创建一个名字为mySelect触发器,当对改表做插入和更新操作时,该触发器自动执行,检索出修改后的titles表的记录:

use pubs

go

CREATE TRIGGER mySelect

ON titles

FOR INSERT, UPDATE

as

Select * from titles

GO

可执行如下语句看一下触发器的运行结果:

update titles set price = 19 where title_id = 'bu1032'

3.5 删除触发器

DROP TRIGGER是从当前数据库中删除一个或多个触发器。 其语法为:

DROP TRIGGER {

触发器名字 } [ ,...n ]

删除触发器的语句是:

use pubs

DROP TRIGGER mySelect

3.6 游标的使用

DECLARE CURSOR定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。

第 28 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第29页 共58页创建游标的简单语法是:

DECLARE cursor_name CURSOR

FOR select_statement

下面是一个具体创建使用游标的语句:

--建立(定义)一个游标

DECLARE authors_cursor CURSOR

FOR

SELECT au_lname

FROM authors

--(打开游标)

OPEN authors_cursor

--取游标记录,插入到变量中

FETCH NEXT FROM authors_cursor INTO @au_lname

--浏览游标记录

WHILE @@FETCH_STATUS = 0

BEGIN

print @au_lname

--取下一记录

FETCH NEXT FROM authors_cursor INTO @au_lname

END

--关闭游标

CLOSE authors_cursor

第 29 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

--(释放游标)

DEALLOCATE authors_cursor

页码:第30页 共58页

第四节 系统存储过程、系统表

4.1 系统存储过程

系统存储过程是SQLServer内置的具有强大功能的存储过程,系统存储过程一般都是以SP_开始的,应尽可能利用已有的系统存储过程来实现操作目标(可以将系统存储过程简单的理解为是SQLServer的辅助工具)。

以下列出一些比较常用的系统存储过程:

系统存储过程的名字

sp_attach_db

sp_attach_single_file_db

作用

将数据库附加到服务器

将只有一个数据文件(就是以.mdf为扩展名的文件)的数据库附加到当前服务器

从服务器分离数据库

显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本

执行可以多次重用或动态生成的 Transact-SQL 语句或批处理,Transact-SQL 语句或批处理可以包含嵌入参数

sp_detach_db

sp_helptext

sp_executesql

关于系统存储过程,在SQLServer联机帮助 “Transact-SQL 参考 系统存储过程, 概述”中有详细介绍。

第 30 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第31页 共58页

4.2 系统表

系统表也是一种数据库中的表,是由系统自动创建维护的,用户通常在系统表中得到很多有用信息。

这里重点讲解两个系统表:sysdatabases表和sysobjects表,其他系统表的介绍请参看附录和联机帮助。

4.2.1 sysdatabases系统表

sysdatabases系统表存在于master库内,Microsoft® SQL

Server™ 中的每个数据库在该表中占一行,该表比较常用的两个字段是name字段(代表数据库的名称),dbid字段(代表数据库 ID,这个字段在后面的SQLServer事件探查器的筛选操作时会用到)

在SQLServer查询分析器中执行一下语句,找出数据库名字为UFSystem的数据库ID:

select dbid,* from master..sysdatabases where name = 'ufsystem'

4.2.2 sysobjects系统表

sysobjects系统表存在于每个用户自建的数据库中,在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行,该表常用的字段有xtype字段(代表对象类型,常用的类型有:U = 用户表、P = 存储过程、TR = 触发器、V = 视图、D

= 默认值或 DEFAULT 约束),name字段(代表对象名,如表名、存储过程名)

在SQLServer查询分析器中执行一下语句,找出表名字为au开头的用户自定义表:

select name from pubs..sysobjects where xtype = 'u' and name

like 'au%'

第 31 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第32页 共58页 其中的'%'是通配符。

4.2.3 sysobjects系统表的高效使用方法

如果要查找一个指定名字的触发器所依赖的表,那么利用sysobjects系统表可以快速实现该需求。

如:pubs库中有个名字是employee_insupd的触发器(这个名字很有可能是被后面讲的事件探查器跟踪出来的结果),若想查询该触发器是依赖于哪个表时,以下的语句非常有用。

检索出指定数据库中所有的触发器名字:

select * from pubs..sysobjects where xtype = 'tr'

根据触发器的具体名字,查出它所依赖的表:

select object_name(parent_obj) as 表名 from pubs..sysobjects

where xtype = 'tr' and name = 'employee_insupd'

上句中的object_name( )是个系统函数,作用是将对象ID转换为对应的对象名。Object_ID( )作用与之相反。

本章小结:

通过本章与上一章的学习,对SQL语句的用法及数据库系统表结构有了框架性的了解,为SQL Server其他功能的应用提供了基础,但在工作过程中,还要根据实际遇到的问题,对本部分所涉及知识进行更深入的研究,才能使SQL语句的功能得到更灵活、全面的应用。

第 32 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第33页 共58页

第四章 事件探查器的使用

本章主要介绍在实际维护工作中经常用到的一个SQLServer工具:事件探查器。

事件探查器的功能是监视SQL Server数据库系统引擎事件,主要用于监视SQL SERVER系统的运行性能。此外,它还能够以连续、断点或单步方式执行Transact-SQL语句和存储过程,所以,在应用程序开发阶段也常用它来调试或测试所编写的的脚本程序和存储过程。在实际工作中,常用事件探查器来跟踪U8软件界面操作所涉及的后台数据库交互的情况。

事件探查器主要使用流程是:建立跟踪进行跟踪;精确跟踪;定位问题解决问题。

第一节 创建跟踪

第一步,在开始菜单下打开事件探查器;连接对应的服务器;

第二步,点“文件”---“新建”---“跟踪”,连接对应的服务器,确定;

第 33 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第34页 共58页

第三步,在“跟踪名”中输入对应的名称,默认为“无标题-(数字)”,也可以选择已有的跟踪模板;

第 34 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第35页 共58页

第 35 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第36页 共58页

第四步,在“事件”页选择您希望跟踪的事件;(建议选择:TSQL---SQL:BatchCompleted;存储过程---:SP:StmtCompleted;错误和警告---ErrorLog、EventLog、Exception)

第 36 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第37页 共58页

第五步,在“数据列”页选择您关注的数据列;(建议选择:EventClass、TextData、SPID)

第 37 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第38页 共58页

第六步,在“筛选”页指定捕获那些事件的选择;

第 38 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第39页 共58页

第七步,选择完毕后点运行开始跟踪。

第二节 事件探查器的精确跟踪

第一步,用事件探查器的默认跟踪模板进行跟踪,大概确定一第 39 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第40页 共58页下问题范围。

第二步,在确定了大概的问题范围后,进行必要的筛选,用自定义的跟踪模板,如:确定问题涉及到哪个数据库,如果不涉及系统库(UFSystem库),可以用DatabaseID进行筛选,把对UFSystem库的跟踪排除,方法如下:

在SQLServer查询分析器中执行:

select dbid,* from master..sysdatabases where name =

'ufsystem'

返回的dbid值即是UFSystem库的DatabaseID值,在筛选时选择DatabaseID不同于这个返回值即可。

第三步,再利用事件探查器进行跟踪。

第三节 实际工作中事件探查器的应用

在实际U8软件维护过程中,经常遇到的问题主要有两类:一类是显式的错误和异常,可直接在事件探查器中利用Exception事件捕获;另一类是隐式的数据错误,在事件探查器中无明显的问题捕获标识,如用户的汇总表和明细表数据不一致(通常叫做数据对不上)等。

3.1 显式的错误和异常的解决

对于第一类问题,通常的解决办法是:

首先要利用事件探查器跟踪有问题账套,重点查看在跟踪过程中,报错语句前后的sql语句所涉及到的数据表或数据对象内容是否有问题。

确定问题账套的报错位置后,再利用事件探查器跟踪演示账套(或者不出问题的其他用户账套),并且重点对比有问题账套报错处

第 40 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第41页 共58页前后sql语句涉及的表或数据对象内容有何差别。根据对比结果确定出错数据,对问题账套进行修改即可。

在实际处理问题过程中,应用这种办法通常都能有效解决此类问题。

3.2 隐式的数据错误问题的解决

对于这类问题,通常的解决办法是:

再现该存在问题的操作(在软件界面操作),同时实时查看后台的跟踪结果,查找出实现该功能sql语句所操作的数据表或数据对象。

在实际处理问题过程中,通常遇到的情况都是:存在问题操作涉及的明细表数据正确,而汇总表数据有错,这时,利用明细表中数据来修改汇总表中的对应数据即可。

3.3 涉及存储过程、视图、触发器问题的解决

在处理以上两类问题的时候,还会遇到事件探查器跟踪出的结果涉及存储过程、视图、触发器等,这时不能单纯应用以上办法来解决,而是要进一步研究该存储过程、视图、触发器等所涉及的具体表或数据对象,往往这些对象涉及的表或数据对象比较繁多复杂,因此要对此类对象的SQL语句进行深入分析,再确定解决办法。

在SQLServer的查询分析器中执行系统存储过程“sp_helptext

对象名”可以查询具体存储过程、视图、触发器的SQL语句内容。

本章小结:

初次使用事件探查器时,一般用默认跟踪模板即可。随着使用经验的积累,可以更为深入的探索事件探查器的一些有用的高级功能。

第 41 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第42页 共58页 本专刊主要讲解了SQL语句的用法,其实很多功能都可以在SQLServer的企业管理器中,通过可视化的操作可实现相同的功能。但在有些情况下,直接使用SQL语句比SQLServer企业管理器的可视化操作更为灵活高效。这一点在今后的实践中会有深刻体会。

掌握了SQL的基本语法后,在今后的工作学习中要不断实践,一定要将SQLServer的联机帮助作为自己最好的老师。

衷心祝你早日成为SQLServer专家!

附 录

组成数据库的对象

A:表(table)具体组织和存储数据的对像,由列和行组成.

B:主键(primary key)

C:外键(foreign key)

D:视图(view)从一个或几个基本表中根据用户需要而做成一个虚表.

1:表中一列或多列的组合,它本身不是本表的主键,而是另外一个表的主键.[一对多关系]

2:外键是两个表发生关系一个纽带.

1:表中一列或多列的组合,其值唯一确定表的一行.

2:主键不能重复

3:作为主键各列都不能为空.

1:行和列顺序可以是任意的.在同一个表中列名必须是唯一的.

2:在同一个数据库里面表名也必须要是唯一.

第 42 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第43页 共58页

1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据

2:视图只在刚刚打开的一瞬间,通过定义从表中搜集数据,并展现给用户

E:约束(constraint)

F:默认值(default)

G:事务(Transaction)

1:在关系型数据库里面一般使用“事务“来处理用户提交的修改表和数据的操作

2:事务就是一次性完成的一组数据的操作.

3:事务的持征:位于事务中的操作要么全部都做,要么全部取消,从而维护了数据库中数据的合理性.

4:关系数据库中一般按照先写日志的方法进行事务操作.即:在实施事务之前先将要进行操作的记录写入日志,再进行实际的数据修改.

5:是记录关系数据修改的情况的笔记.

1:在向表中插入数据时,为没有指定数据的列提供一个默认的数据

1:对表中各列的取值范围进行限制,以确保表中数据的合理有效.

第 43 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第44页 共58页 6:在用户对数据库实施之前,sql会把两种形式的情况写入日志.

1:实施事务之间的数据状态.

2:实施事务之后的数据状态.

当事务由于中途被破坏时,sqlserver会利用日志记录把数据恢复成实施事务之前的数据状态,即撤消事务(回滚);

如果事务顺利的执行则把数据恢复成实施事务之后的状态,即执行事务(前滚).

H:规则(rule)

I:索引(index)

J:存储过程(store procedure)

一组经过编译好的可以重复使用的sql代码.存储过程是在服务器中执行,用户可以调用存储过程并接收存储过程返回的结果.

K:触发器(trigger)

一种特殊的存储过程.

1:同约束一样,对特定的列进行限制,如:单价*数量=总额

1:提供一种无需扫描整张表就能实现对数据快速访问的途径.可以使用索引来优化查询.[用索引可以实现排序]

1:由于存储过程是存储在服务器,所有可以让每一个客户重复使用,减少sql代码书写量.

2:由于存储过程是事先编译好的sql代码,所以在执行时,并不做语法检验,可以大大提高sql语句的执行效率.

1:触发器与表相关.

第 44 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第45页 共58页

2:当用户对指定的表进行某种操作时,触发器会自动执行,去做它里面sql代码

L:数据类型(data type)

M:日志(log)

1:sql server使用日志记载用户对数据库进行的一系列的操作.日志是维护数据库完整性的重要工具.sql server遵守先写日志再对数据库进行操作.所以某一天,如果数据库损坏,但可以通过日志进行恢复.

SQLSERVER系统组成

1:sql server系统数据库.

A:master:最重要的一个数据库.保存了:

服务器的用户名密码.

服务器的配置信息

使用的数据类型

错误信息

系统或者用户建立的所有对像

说明:由于master数据库比较重要所以不要在里面建表,不要修改里面的任何内容.

1:两种类型:系统数据类型,用户自定义数据类型.

2:系统数据类型:int,float,char,varchar,text[备注,工作简历],image[存储图像]

第 45 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第46页 共58页 B:tempdb:临时数据库

1:记录所有的临时表格或者数据.

2:tempdb是一个全局资源,任何连接到sql server都可以使用.

3:该数据库所放有的数据全部是临时,这就是说当sql server服务停止之后,所有数据将会消失

C:model数据库:模板数据库.

1:是建立新的数据库一个样式.

2:当用户建立一个数据库的时候,首先要从model数据库里面复制所有的表.

D:msdb数据库:

主要被sql server agent服务用于操作作业调度以及管理报警.

2:系统表

A:服务器级系统表:[master数据库里面]

1:sysdatabases:记录所有的数据库的相关信息

2:sysmessages:记录了系统错误和警告信息

3:syslangues:记录了服务器能够识别的语言

4:sysconfigures:记录了服务器配置情况

5:systype:记录了服务器所有数据类型

第 46 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第47页 共58页 B:数据库级系统表:[保存在不同的数据库里面]

1:sysbojects:所有数据库的对像的相关资料.[类型:u:表,V:视图,P:存储过程,tr:触发器]

2:sysusers:所有数据库的用户的信息.

3:syscolumns:所有数据库表中的列.

3:系统的存储过程:

存放在MASTER数据库,以SP_开头,如:

1:sp_help 表名:查看表的信息:

2:sp_renamedb 旧名字,新名字:把数据库更名.

pubs,northwind.

Transact_SQL小手册

数据操作

SELECT --从数据库表中检索数据行和列

INSERT --向数据库表添加新数据行

DELETE --从数据库表中删除数据行

UPDATE --更新数据库表中的数据

4:示列数据库:

数据定义

第 47 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第48页 共58页 CREATE TABLE --创建一个数据库表

DROP TABLE --从数据库中删除表

ALTER TABLE --修改数据库表结构

CREATE VIEW --创建一个视图

DROP VIEW --从数据库中删除视图

CREATE INDEX --为数据库表创建一个索引

DROP INDEX --从数据库中删除索引

CREATE PROCEDURE --创建一个存储过程

DROP PROCEDURE --从数据库中删除存储过程

CREATE TRIGGER --创建一个触发器

DROP TRIGGER --从数据库中删除触发器

CREATE SCHEMA --向数据库添加一个新模式

DROP SCHEMA --从数据库中删除一个模式

CREATE DOMAIN --创建一个数据值域

ALTER DOMAIN --改变域定义

DROP DOMAIN --从数据库中删除一个域

数据控制

GRANT --授予用户访问权限

DENY --拒绝用户访问

REVOKE --解除用户访问权限

事务控制

COMMIT --结束当前事务

ROLLBACK --中止当前事务

SET TRANSACTION --定义当前事务数据访问特征

程序化SQL

第 48 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第49页 共58页 DECLARE --为查询设定游标

EXPLAN --为查询描述数据访问计划

OPEN --检索查询结果打开一个游标

FETCH --检索一行查询结果

CLOSE --关闭游标

PREPARE --为动态执行准备SQL 语句

EXECUTE --动态地执行SQL 语句

DESCRIBE --描述准备好的查询

局部变量

declare @id char(10)

--set @id = '10010001'

select @id = '10010001'

全局变量

IF ELSE

declare @x int @y int @z int

select @x = 1 @y = 2 @z=3

if @x > @y

print 'x > y' --打印字符串'x > y'

else if @y > @z

print 'y > z'

else print 'z > y'

必须以@@开头

CASE

第 49 页 共 58 页

2023年6月21日发(作者:)

引 言

本专刊主要针对于刚刚加入用友维护队伍、希望快速提高个人面向U8软件维护工作的SQLServer应用能力的人员而编写,特别适用于SQLServer初学者。

注意:本专刊是为SQLServer快速入门而编写,内容简单概括,读者要使自己的SQLServer水平有质的提高,在实际工作中要充分利用SQLServer联机帮助,它是最具权威的参考资料。

本专刊主要内容:

第一章 概述U8数据库特点、常用的SQL工具、语法格式,以及SQLServer数据库中的一些常用的术语。

第二章和第三章主要介绍SQL的基础、高级应用。

第四章 简要介绍事件探查器的使用。事件探查器是U8维护工作中最为常用的分析工具。

附录 内容包括组成数据库对象的概念、SQLSERVER的系统组成以及Transact_SQL小手册,可以作为查询SQLServer信息的快速参考。

2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第2页 共58页

信息反馈:

由于时间和水平有限,不当之处和错误在所难免,如果在阅读中发现本专刊有错误之处,恳请读者批评指正!

如果读者对本刊的编制或SQLServer学习方面有好的意见或建议,敬请email至如下地址:

陈 媛 cheny@

陈湘林 gccxl@

马大刚 mdg@

致谢:

本期SQLServer专刊是在两期新员工、部分分公司维护人员进行的SQLServer培训的基础上整理而成。参与培训人员对本专刊的编制提供了很多有益的意见和建议,在这里对他们积极支持和配合(特别是新员工李丹,对最后定稿的排版、勘误做了大量工作)致以衷心的感谢!

第 2 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第3页 共58页

目 录

第一章 概述 ......................................................................................... 4

第一节

U8数据库简述 .................................................................... 4

第二节

常用的SQL工具简介 ......................................................... 6

第三节

数据库中的常用术语和概念 .............................................. 8

第四节

SQL语法格式说明.............................................................. 9

第二章 SQL基础应用 ....................................................................... 11

第一节

简单的SELECT查询 ....................................................... 12

第二节

SELECT语句中的常用子句及函数 ................................... 12

第三节

连接(JOIN)语句 ............................................................. 14

第四节

数据操作语句 .................................................................... 19

第五节

SELECT子查询语句 ........................................................... 20

第三章 SQL高级应用 ....................................................................... 23

第一节

创建、删除数据库和表 .................................................... 23

第二节

创建视图和索引 ................................................................ 24

第三节

创建和执行存储过程、触发器和游标 ............................ 26

第四节

系统存储过程、系统表 .................................................... 30

第四章 事件探查器 ........................................................................... 33

第一节

创建跟踪 ............................................................................ 33

第二节

事件探查器的精确跟踪 .................................................... 39

第三节

实际工作中事件探查器的应用 ........................................ 40

附录: ................................................................................................... 42

第 3 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第4页 共58页

第一章 概述

SQL(Structured Query Language,结构化查询语言)是一种现今流行的数据库语言,目前主流的数据库产品都支持这种语言,如常见的Microsoft Access、Microsoft SQLServer、Oracle、Sybase、MySQL等,并且这些数据库产品都不同程度上对标准的SQL进行了扩展,以使SQL应用更为高效。

用友产品以Microsoft Access(如8.12A版本)或MicrosoftSQLServer(如U8以上版本)作为后台数据库,目前(8.x、U8)不支持其他的数据库产品。

第一节 U8数据库简述

1.1 U8数据库

用友U8系列产品的后台数据库是采用Microsoft SQLServer。

U8系列产品的数据库按功能主要可分为三类:

A.系统数据库UFSystem;

B.账套数据库UFData_xxx_xxxx(如UFData_999_2003,其中999表示账套号,2003表示会计年度);

C.模板数据库UFModel。

其中UFSystem库用于存储一些公共系统信息,如操作员信息、账套系统信息等,UFData_xxx_xxxx库用于存储账套数据,UFModel

第 4 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第5页 共58页库在新建账套时作为模板数据库使用。

每个SQLServer数据库是由两类文件组成:一类是数据文件,包括主数据文件(扩展名为mdf)和次要数据文件(扩展名为ndf,该类文件不是必须的,U8数据库通常没有该文件);一类是日志文件(扩展名为ldf)。

1.2 8.X数据库

用友早期产品以Access为后台数据库,这些产品(如8.12A)目前仍有很多用户在使用。

大部分8.X产品的系统库和账套数据库都是Access数据库类型。

每个Access数据库只对应一个文件,以mdb为扩展名。

以Access为后台数据库的产品,用Access软件可以直接打开对应的数据库文件,该数据库文件可以作为参考的数据字典使用(点击每个表的设计模式,内有详尽的字段含义解释)。

另外,以Access为后台数据库的产品安装盘中有压缩的演示账套数据库文件,直接用Winzip解压缩后,手工将该文件扩展名更改为以.mdb为结尾,就可以作为参照的数据字典使用。

1.3 SQLServer和MSDE的关系

MSDE是SQLServer的一个简版,该版本是免费使用的,功能和SQLServer基本相同,只是在多用户条件下运行效率低于SQLServer产品,而且,MSDE本身没有一个可视化的操作界面,只是在后台运行,不过,SQLServer等数据库软件仍可以在远程访问控制该数据库。

虽然用友支持SQLServer的产品也支持MSDE,但用友产品需要的某些数据库高级功能则要求用户必须使用SQLServer作为后台数据库(如数据库的数据抽取功能)。而且在实际的维护实践中,也

第 5 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第6页 共58页会发现,MSDE出现异常的情况远多于SQLServer。所以,在维护中如果遇到以MSDE作为后台数据库的情况应多加注意此方面的问题。

1.4 Microsoft SQLServer、MSDE与Access数据库的比较

Microsoft SQLServer和MSDE支持的功能远多于Access,Access通常不支持SQL的高级功能,如:存储过程、触发器等。

Microsoft SQLServer配有强大的辅助工具,特别是事件探查器工具,而Access产品没有实现此类功能的工具。另外,Access的产品的安全性也远低于SQLServer产品。

第二节 常用的SQL工具简介

SQL本身是一种语言,需要在特定的环境中运行。U8产品的Microsoft SQLServer、MSDE以及8.12A产品的Access都为SQL提供了运行环境。

为了使8.X、U8系列产品正常运行,必须要先安装好对应的后台数据库产品(关于Microsoft Access和Microsoft SQLServer如何安装,请参阅安装盘帮助文件)。

2.1 Microsoft SQLServer

SQLServer中常用的工具包括:企业管理器、查询分析器、事件探查器等。如图1所示:

第 6 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第7页 共58页图1

企业管理器:可进行各种可视化的操作,功能强大,但由于其运行时消耗资源较大,所以当计算机硬件条件不好或者SQLServer负载太大时,会有操作反映迟钝等问题。

查询分析器:是交互式图形工具,它使数据库管理员或开发人员能够编写查询、,同时执行多个查询、,查看结果、,分析查询计划和获得提高查询性能的帮助。

事件探查器:是图形工具,使系统管理员得 以监视 Microsoft® SQL

Server™ 实例中的事件。可以捕获有关每个事件的数据并将其保存到文件或 SQL Server 表中供以后分析。

2.2 Microsoft Access

快捷方式如图1所示。

第 7 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第8页 共58页第三节 数据库中的常用术语和概念

本节主要介绍一些常用的SQLServer术语和概念,更多术语请参考联机帮助中的“词汇表”内容,查询位置如图2所示。

图2

数据库 (database) :为特定目的(如搜索、排序和重新组织数据)而组织和提供的信息、表和其它对象的集合。数据库存储在文件中。如:UFData_999_2003就是一个数据库。

表 (table) :一种二维数据对象,由行和列组成,用于存储关系数据库中的数据。每个表存储有关由数据库建模的一类对象的信息。例如,某个教育数据库将具有一个教师表、一个学生表和一个课程表。

第 8 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第9页 共58页

字段 (field) :存储单个数据值的窗口或记录中的某个区域。某些数据库(如 Microsoft Access)将字段用作列的同义词。如Accinformation表中的cSysID字段。

记录 (record) :视作一个单元信息的一组相关字段(列)。在 SQL

数据库中记录更经常被称作行。

第四节 SQL语法格式说明

在SQLServer联机帮助中,可看到如下语句语法:

SELECT [ ALL | DISTINCT ]

[ TOP n [ PERCENT ] [ WITH TIES ] ]

< select_list >

< select_list > ::=

{ *

| { table_name | view_name | table_alias }.*

| { column_name | expression | IDENTITYCOL |

ROWGUIDCOL }

[ [ AS ] column_alias ]

| column_alias = expression

} [ ,...n ]

如何理解上句中的各种符号的涵义呢?在联机帮助中搜索“Transact-SQL 语法规则”,会找到如图3所示内容,其中包含了详细的SQL语法符号的具体涵义。

第 9 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第10页 共58页图3

本章小结:

本章只是简要介绍了一些比较基础的术语和概念,目的是使读者对SQLServer有个总体的印象,以便能有效的进行后续的学习。更多的内容还请参阅联机帮助。

第 10 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

第二章 SQL基础应用

页码:第11页 共58页 让我们从Select语句开始对SQL语法的学习。本专刊中所使用的SQL语句均在SQLServer查询分析器中执行。对SQL语言的学习,关键是要边学习边实践,读者可以在SQLServer查询分析器中实际练习本专刊提供的语句。

Select语句的功能为从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列,该语句包含众多的子句,功能强大,使用灵活。

下面先简要说明在SQLServer查询分析器中执行SQL语句的步骤:

第一步:运行查询分析器,如图3所示:

图3

第二步:执行选中待操作的数据库语句。如图3所示:选中use

ufdata_887_2004后,点击绿色箭头(或直接按F5)执行,该语句中,use为连接目标数据库的SQL关键字,ufdata_887_2004是要进行相应操作的目标数据库。

第三步:执行相应的SQL语句(如图3中的select * from

第 11 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第12页 共58页accinformation语句)。

第一节 简单的SELECT查询

在SQLServer的查询分析器中执行如下两句SQL语句:

USE Northwind

SELECT *

FROM [Order Details]

执行该语句返回Order Details表中包含所有列的记录。这两句SQL语句也可以合并为一条语句:

SELECT * FROM Northwind..[Order Details]

Northwind..[Order Details]表示 [Order Details] 表是Northwind数据库中的表,使用这种形式,就不用再提前连接数据库了(即不用使用use语句来连接数据库)。

注意:由于上面语句中表名Order Details两个单词之间存在空格,所以使用中括号,如果表名中不存在空格,如表名为Orderdetails,则中括号可以省略。

第二节 Select语句中的常用子句及函数

2.1 SQL中函数的使用

在SQL 中的函数可以执行一些储如对某一列进行汇总或将一个字符串中的字符转换为大写的操作。比较常用的函数有聚合函数、日期与时间函数、数学函数、转换函数和字符函数等,具体内容参见附录。在这里以一个最常用的聚合函数为例。

第 12 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第13页 共58页sum()就如同它的本意一样,返回某一列的所有数值的和。可以到查询分析器中执行如下语句(求数量的总和):

SELECT sum(quantity) FROM Northwind..[Order Details]

注意:此处必须指定要合计的具体列而不能使用*,并且该列必须是数值型。

2.2 Select语句的常用子句

Select中的常用子句包括:Where,Order By,Group by,Having,Join等。Join语句会在第三节重点讲解。本节主要讲解前四个子句的用法。

2.2.1 Where子句

Where子句的作用是指定查询返回行的条件。如:返回Northwind数据库中Order Details表中的数量(quantity)字段值大于100的记录,SQL语句可写为:

SELECT * FROM Northwind..[Order Details] Where quantity>100

2.2.2 Order By子句

Order By子句是用来指定在 SELECT 语句返回的列中所使用的排序次序。如:根据某一列排序(如OrderID列),SQL语句可写为:

USE Northwind

SELECT * FROM [Order Details] ORDER BY OrderID

2.2.3 Group By子句

Group By子句主要和函数连用(如sum函数),按指定列汇总。如:返回Northwind数据库中Order Details表中,productID字段相同的数量之和,SQL语句可写为:

第 13 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第14页 共58页SELECT ProductID, sum(quantity) FROM Northwind..[Order

Details] Group By ProductID

2.2.4 Having子句

Having子句一般要和GROUP BY 子句连用。如:上句中要再加一个条件,数量之和大于1000的返回记录,SQL语句可写为:

SELECT ProductID, sum(quantity) FROM Northwind..[Order

Details] Group By ProductID Having sum(quantity)>1000

2.2.5 Where子句和Having子句的区别

Where子句和Having子句的主要区别:和Group By连用时,Where后面的条件是先排除再进行Group By汇总;而Having是在Group By汇总后,再用后面的条件进行筛选。另外Having语句后的条件可以是聚合函数(如sum函数、Max函数),而where后不能接聚合函数。如下面的语句:

SELECT ProductID, sum(quantity) FROM Northwind..[Order

Details] Group By ProductID Having sum(quantity)>1000

如果用Where语句后加相同筛选条件则无法实现目标功能。

第三节 连接(Join)语句

Join子句的主要作用,就是将两个表横向连接起来。Join分为内连接和外连接。内连接为[Inner] Join(默认形式,Inner可以省略);外连接分为三个Left Outer Join、Right Outer Join、Full Outer Join(其中的Outer可以省略)。

下面举一个例子来说明Join子句的用法。有两个表father和son结构如下(其中father表的Fid字段和Son表的Fid字段是对应的):

第 14 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第15页 共58页father表

Fid

1

2

3

Son表

Sid

1

2

3

4

5

6

Name

Ason1

Ason2

Ason3

Cson1

Cson2

Dson1

Fid

1

1

1

3

3

4

Name

A

B

C

3.1 使用内连接语句Inner Join连接

Inner Join返回两个表中匹配的行。两个表中不匹配的行不在结果中显示。如果未指定联接类型,则该连接形式为默认形式。

在SQLServer查询分析器中执行如下语句:

Select * From father Join son On =

结果如下:

1

2

3

4

5

Fid

1

1

1

3

3

Name

A

A

A

C

C

Sid

1

2

3

4

5

Name

Ason1

Ason2

Ason3

Cson1

Cson2

Fid

1

1

1

3

3

第 15 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第16页 共58页

3.2 使用左连接语句Left Outer Join连接

Left Outer Join指定在结果集中除包含左右表中匹配的数据外,还返回左表中所有不满足联接条件的行,且右表中相应字段值为 NULL。其中Outer可以省略,但Left和Join关键字不可省略。

在SQLServer查询分析器中执行如下语句:

Select * From father Left Join son On =

结果如下(注意下表中的NULL):

1

2

3

4

5

6

Fid

1

1

1

2

3

3

Name

A

A

A

B

C

C

Sid

1

2

3

NULL

4

5

Name

Ason1

Ason2

Ason3

NULL

Cson1

Cson2

Fid

1

1

1

NULL

3

3

在SQLServer查询分析器中执行如下语句:

Select * from father left join son on = where

is null

实现的功能为:找出在father表中有,而在son表中没有对应的记录。

3.3 使用右连接语句Right Outer Join连接

Right Outer Join语句和Left Outer Join 语句的用法原理相同。Right Outer Join语句是在结果集中除包含左右表中匹配的数据外,还返回右表中所有不满足联接条件的行,且左表中相应字段值为 NULL。其中Outer可以省略,但Right和Join关键字不可省

第 16 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第17页 共58页略。

在SQLServer查询分析器中执行如下语句:

Select * From father Right Join son On =

结果如下(注意下表中的NULL):

1

2

3

4

5

6

Fid

1

1

1

3

3

NULL

Name

A

A

A

C

C

NULL

Sid

1

2

3

4

5

6

Name

Ason1

Ason2

Ason3

Cson1

Cson2

Dson1

Fid

1

1

1

3

3

4

在SQLServer查询分析器中执行如下语句:

Select * from father Right join son on = where

is null

实现的功能为:找出在Son表中有,而在father表中没有对应的记录。

3.4 使用全连接语句Full Outer Join连接

Full Outer Join是指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。其中Outer可以省略,但Full和Join关键字不可省略。

在SQLServer查询分析器中执行如下语句:

Select * From father Full Join son On =

结果如下(注意下表中的NULL):

Fid Name Sid Name Fid

第 17 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

1

1

1

3

3

NULL

2

A

A

A

C

C

NULL

B

1

2

3

4

5

6

NULL

Ason1

Ason2

Ason3

Cson1

Cson2

Dson1

NULL

页码:第18页 共58页1

2

3

4

5

6

7

1

1

1

3

3

4

NULL

在SQLServer查询分析器中执行如下语句:

Select * from father Full join son on = where

is null Or is null

实现的功能为:找出在Son表中有,而在father表中没有对应的记录以及在Father表中有,而在son表中没有对应的记录。

3.5 Join子句小结

在U8产品中,大量使用了Inner Join、Left Join、Right Join和Full Join子句。

Join语句以其灵活的应用方式,可以方便的实现各种的复杂查询功能。有些简单的功能也能用另外的一个子句:IN子句可以实现,但IN子句实现的功能要比Join语句简单很多。因此一定要重点学习Join语句的各种灵活使用的方法。

In子句会在Select语句子查询语句中讲解。

3.6 Union子句的用法

Join子句是用来将两个表横向连接起来组成一个新表,而Union子句是将两个表纵向连接起来组成一个新表。

当然,Union纵向连接两个表是有限制条件的:两个表的列数相等,且对应列的类型兼容(可以简单的理解为类型相同)。

第 18 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第19页 共58页具体的Union语法请查询联机帮助。

第四节 数据操作语句

数据操作语句包括INSERT、 UPDATE 和DELETE 等

4.1 插入Insert Into子句使用方法

可以使用 INSERT INTO 在当前表中创建新行。

在SQLServer查询分析器中执行如下语句:

INSERT itles

(title_id, title, type, pub_id, price)

VALUES ('BU9876', 'Creating Web Pages', 'business',

'1389', 29.99)

type、 pub_id、 price是目标数据表的列名字,Values关键字后面是要插入对应列的具体数据。

4.2

DELETE删除子句使用方法

DELETE从表中删除行。为了尽可能的减少误操作最好在执行delete语句之前,先执行对应的select语句,以确定Where后面条件的准确性。

在SQLServer查询分析器中执行如下语句(删除刚才插入的记录):

select * itles where title_id ='BU9876'

delete itles where title_id = 'BU9876'

4.3

UpDate子句使用方法

第 19 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第20页 共58页UPDATE子句是用于更改表中的现有数据。为了尽可能的减少误操作最好在执行UPDATE语句之前,先执行对应的select语句,以确定Where后面条件的准确性。

在SQLServer查询分析器中执行如下语句(更改刚才插入的记录,如果已经删除,请重新用Insert Into插入语句插入相应的数据):

select * itles where title_id ='BU9876'

itles set price = 200 where title_id

='BU9876'

4.4

Select Into子句使用方法

SELECT … INTO

new_table

From…子句创建新表并将查询的结果行插入新表中。

在SQLServer查询分析器中执行如下语句:

Select *

w_table1

itles

用语句Select * w_table1可以查询出刚才新生成的表及其中刚刚插入的数据。

注意:Select Into子句并不能将原来表的一些关系复制到新表中(如外键等),它只能插入相应的数据。所以要想既复制表关系又复制其中的数据,请使用SQLServer企业管理器中提供的导表功能。

第五节 Select子查询语句

5.1 子查询使用方法

第 20 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第21页 共58页子查询是一个 SELECT 查询,任何允许使用表达式的地方都可以使用子查询。

在SQLServer查询分析器中执行如下语句(一个子查询用作

SELECT 语句中名为 MaxUnitPrice 的列表达式):

SELECT D, ate,

(SELECT MAX(ice)

FROM .[Order Details] AS OrdDet

WHERE D = D) AS

MaxUnitPrice

FROM AS Ord

其中的As关键字用于指定别名。

5.2 In子句的使用方法

IN子句是确定给定的值是否与子查询或列表中的值相匹配。

下面的示例选择名称和州的列表,列表中列出所有居住在加利福尼亚、印地安纳或马里兰州的作者:

SELECT au_lname, state

FROM pubs..authors

WHERE state IN ('CA', 'IN', 'MD')

请参看“3.2 左连接语句Left Outer Join”的例子(找出在father表中有,而在son表中没有对应的记录):

Select * from father left join son on = where

is null

对等的In子句是(注意这个语句并没有将两个表横向连接起来,同时也用了子查询语句):

Select * from father where Not In (Select fid

from son)

第 21 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第22页 共58页

本章小结:

本章主要讲解了SQL语句的常用语法。Select语句及其子句灵活的语法是学习的难点,在U8维护工作中, Join子句是最为常用的语法,必须重点学习。

本专刊附录部分,详尽讲解了本章所涉及SQL语句一些较为高级灵活的用法,另外学习这些语法时,一定要结合SQLServer的联机帮助。

第 22 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第23页 共58页

第三章 SQL高级应用

有了SQL基础,本章开始讲解一些SQL的高级应用。包括如何创建数据库、表、索引,视图、存储过程、触发器、游标的简单应用等,同时本章也讲解一些能有效提高维护效率的SQL知识:系统存储过程、系统表的应用。

第一节 创建、删除数据库和表

1.1 创建、删除数据库的SQL语法

创建数据库的语法:create database 数据库名

在查询分析器中写:Create Database testData,选中该语句,按F5执行,创建了一个名字为testData的数据库。

删除数据库的语法:drop database 数据库名

在查询分析器中写:Drop Database testData,选中该语句,按F5执行,删除名字为testData的数据库。

1.2 创建、修改、删除数据库中表的SQL语法

创建表的语法:create table 表名

(

列名1 数据类型(长度) not NULL [NULL],

列名2 数据类型(长度) not NULL [NULL],

第 23 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第24页 共58页 ................

)

在查询分析器中写:

use testData

Create table testTable1

(

id int,

name varchar(20)

)

选中上面的SQL语句,按F5执行,创建一个名字为testTable1的表。

修改表的关键字是:Alter table(其后可能跟随ALTER COLUMN、ADD、DROP COLUMN等),具体语法可到SQLServer联机帮助中查询。

删除表的语法:Drop table 表名(可以一次性删除多个表,表名和表名之间用逗号隔开)。

在查询分析器中写:Drop table testTable1,选中该语句,按F5执行,删除名字为testTable1的表。

第二节 创建视图和索引

2.1 创建视图

CREATE VIEW是创建一个虚拟表,该表以另一种方式表示一个或多个表中的数据。CREATE VIEW 必须是查询批处理中的第一条语句。

创建视图的简单语法是:

CREATE VIEW 视图名

第 24 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第25页 共58页As

下面的示例为pubs库创建的名字为TestView的视图:

use pubs

go

Create View TestView

As

Select * from authors

视图的使用和表基本相同,如:

select * stview

2.2 删除视图

删除视图的语法为:

drop View 视图名

下面的示例为删除刚刚在pubs库的创建的视图:

USE pubs

drop view testview

2.3 创建索引

为给定表或视图创建索引。只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。

创建索引的简单语法是:

create [unique][clustered] index 索引名 on 表名(列[asc|desc])

下面的示例为pubs库的 authors 表的 au_id 列创建索引:

第 25 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

USE pubs

CREATE INDEX au_id_ind

ON authors (au_id)

页码:第26页 共58页2.4 删除索引

删除索引的语法为:

drop index 表名.索引名

下面的示例为删除刚刚在pubs库的 authors 表的 au_id 列创建的索引:

USE pubs

drop index _id_ind

2.5 视图和表的区别

视图和表的用法基本相同。但他们之间在作用上有很大区别的:视图是用来动态的创建一个表,它占用的数据库空间比较小(基本上就是一些SQL语句),但使用时的执行速度一般比表要慢一些;表的缺点就是比视图占用的数据库空间大,但执行速度比较快。另外视图是以表为基础的。

第三节 创建和执行存储过程、触发器和游标

3.1 创建存储过程

创建存储过程的关键字是Create Proc(也可以是create

procedure)

在SQLServer查询分析器中执行如下语句创建一个名字为testPro的存储过程:

use pubs

第 26 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第27页 共58页

go

create proc testProc

as

select * from authors

带参数存储过程的创建:

use pubs

go

create proc testProcX @name varchar(20)

as

select * from authors where au_lname = @name

执行存储过程

执行无参数存储过程的语句是:

stproc

执行带参数存储过程的语句是(注意参数的赋值):

stprocx @name='white'

删除存储过程

删除无参数和带参数的存储过程的语句分别是:

use pubs

drop proc testProc

use pubs

drop proc testprocX

3.2

3.3

3.4 创建触发器

CREATE TRIGGER是创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。

第 27 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第28页 共58页Microsoft® SQL Server™ 允许为任何给定的 INSERT、UPDATE 或

DELETE 语句创建多个触发器。

在pubs库中的titles表上创建一个名字为mySelect触发器,当对改表做插入和更新操作时,该触发器自动执行,检索出修改后的titles表的记录:

use pubs

go

CREATE TRIGGER mySelect

ON titles

FOR INSERT, UPDATE

as

Select * from titles

GO

可执行如下语句看一下触发器的运行结果:

update titles set price = 19 where title_id = 'bu1032'

3.5 删除触发器

DROP TRIGGER是从当前数据库中删除一个或多个触发器。 其语法为:

DROP TRIGGER {

触发器名字 } [ ,...n ]

删除触发器的语句是:

use pubs

DROP TRIGGER mySelect

3.6 游标的使用

DECLARE CURSOR定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。

第 28 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第29页 共58页创建游标的简单语法是:

DECLARE cursor_name CURSOR

FOR select_statement

下面是一个具体创建使用游标的语句:

--建立(定义)一个游标

DECLARE authors_cursor CURSOR

FOR

SELECT au_lname

FROM authors

--(打开游标)

OPEN authors_cursor

--取游标记录,插入到变量中

FETCH NEXT FROM authors_cursor INTO @au_lname

--浏览游标记录

WHILE @@FETCH_STATUS = 0

BEGIN

print @au_lname

--取下一记录

FETCH NEXT FROM authors_cursor INTO @au_lname

END

--关闭游标

CLOSE authors_cursor

第 29 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

--(释放游标)

DEALLOCATE authors_cursor

页码:第30页 共58页

第四节 系统存储过程、系统表

4.1 系统存储过程

系统存储过程是SQLServer内置的具有强大功能的存储过程,系统存储过程一般都是以SP_开始的,应尽可能利用已有的系统存储过程来实现操作目标(可以将系统存储过程简单的理解为是SQLServer的辅助工具)。

以下列出一些比较常用的系统存储过程:

系统存储过程的名字

sp_attach_db

sp_attach_single_file_db

作用

将数据库附加到服务器

将只有一个数据文件(就是以.mdf为扩展名的文件)的数据库附加到当前服务器

从服务器分离数据库

显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本

执行可以多次重用或动态生成的 Transact-SQL 语句或批处理,Transact-SQL 语句或批处理可以包含嵌入参数

sp_detach_db

sp_helptext

sp_executesql

关于系统存储过程,在SQLServer联机帮助 “Transact-SQL 参考 系统存储过程, 概述”中有详细介绍。

第 30 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第31页 共58页

4.2 系统表

系统表也是一种数据库中的表,是由系统自动创建维护的,用户通常在系统表中得到很多有用信息。

这里重点讲解两个系统表:sysdatabases表和sysobjects表,其他系统表的介绍请参看附录和联机帮助。

4.2.1 sysdatabases系统表

sysdatabases系统表存在于master库内,Microsoft® SQL

Server™ 中的每个数据库在该表中占一行,该表比较常用的两个字段是name字段(代表数据库的名称),dbid字段(代表数据库 ID,这个字段在后面的SQLServer事件探查器的筛选操作时会用到)

在SQLServer查询分析器中执行一下语句,找出数据库名字为UFSystem的数据库ID:

select dbid,* from master..sysdatabases where name = 'ufsystem'

4.2.2 sysobjects系统表

sysobjects系统表存在于每个用户自建的数据库中,在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行,该表常用的字段有xtype字段(代表对象类型,常用的类型有:U = 用户表、P = 存储过程、TR = 触发器、V = 视图、D

= 默认值或 DEFAULT 约束),name字段(代表对象名,如表名、存储过程名)

在SQLServer查询分析器中执行一下语句,找出表名字为au开头的用户自定义表:

select name from pubs..sysobjects where xtype = 'u' and name

like 'au%'

第 31 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第32页 共58页 其中的'%'是通配符。

4.2.3 sysobjects系统表的高效使用方法

如果要查找一个指定名字的触发器所依赖的表,那么利用sysobjects系统表可以快速实现该需求。

如:pubs库中有个名字是employee_insupd的触发器(这个名字很有可能是被后面讲的事件探查器跟踪出来的结果),若想查询该触发器是依赖于哪个表时,以下的语句非常有用。

检索出指定数据库中所有的触发器名字:

select * from pubs..sysobjects where xtype = 'tr'

根据触发器的具体名字,查出它所依赖的表:

select object_name(parent_obj) as 表名 from pubs..sysobjects

where xtype = 'tr' and name = 'employee_insupd'

上句中的object_name( )是个系统函数,作用是将对象ID转换为对应的对象名。Object_ID( )作用与之相反。

本章小结:

通过本章与上一章的学习,对SQL语句的用法及数据库系统表结构有了框架性的了解,为SQL Server其他功能的应用提供了基础,但在工作过程中,还要根据实际遇到的问题,对本部分所涉及知识进行更深入的研究,才能使SQL语句的功能得到更灵活、全面的应用。

第 32 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第33页 共58页

第四章 事件探查器的使用

本章主要介绍在实际维护工作中经常用到的一个SQLServer工具:事件探查器。

事件探查器的功能是监视SQL Server数据库系统引擎事件,主要用于监视SQL SERVER系统的运行性能。此外,它还能够以连续、断点或单步方式执行Transact-SQL语句和存储过程,所以,在应用程序开发阶段也常用它来调试或测试所编写的的脚本程序和存储过程。在实际工作中,常用事件探查器来跟踪U8软件界面操作所涉及的后台数据库交互的情况。

事件探查器主要使用流程是:建立跟踪进行跟踪;精确跟踪;定位问题解决问题。

第一节 创建跟踪

第一步,在开始菜单下打开事件探查器;连接对应的服务器;

第二步,点“文件”---“新建”---“跟踪”,连接对应的服务器,确定;

第 33 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第34页 共58页

第三步,在“跟踪名”中输入对应的名称,默认为“无标题-(数字)”,也可以选择已有的跟踪模板;

第 34 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第35页 共58页

第 35 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第36页 共58页

第四步,在“事件”页选择您希望跟踪的事件;(建议选择:TSQL---SQL:BatchCompleted;存储过程---:SP:StmtCompleted;错误和警告---ErrorLog、EventLog、Exception)

第 36 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第37页 共58页

第五步,在“数据列”页选择您关注的数据列;(建议选择:EventClass、TextData、SPID)

第 37 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第38页 共58页

第六步,在“筛选”页指定捕获那些事件的选择;

第 38 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第39页 共58页

第七步,选择完毕后点运行开始跟踪。

第二节 事件探查器的精确跟踪

第一步,用事件探查器的默认跟踪模板进行跟踪,大概确定一第 39 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第40页 共58页下问题范围。

第二步,在确定了大概的问题范围后,进行必要的筛选,用自定义的跟踪模板,如:确定问题涉及到哪个数据库,如果不涉及系统库(UFSystem库),可以用DatabaseID进行筛选,把对UFSystem库的跟踪排除,方法如下:

在SQLServer查询分析器中执行:

select dbid,* from master..sysdatabases where name =

'ufsystem'

返回的dbid值即是UFSystem库的DatabaseID值,在筛选时选择DatabaseID不同于这个返回值即可。

第三步,再利用事件探查器进行跟踪。

第三节 实际工作中事件探查器的应用

在实际U8软件维护过程中,经常遇到的问题主要有两类:一类是显式的错误和异常,可直接在事件探查器中利用Exception事件捕获;另一类是隐式的数据错误,在事件探查器中无明显的问题捕获标识,如用户的汇总表和明细表数据不一致(通常叫做数据对不上)等。

3.1 显式的错误和异常的解决

对于第一类问题,通常的解决办法是:

首先要利用事件探查器跟踪有问题账套,重点查看在跟踪过程中,报错语句前后的sql语句所涉及到的数据表或数据对象内容是否有问题。

确定问题账套的报错位置后,再利用事件探查器跟踪演示账套(或者不出问题的其他用户账套),并且重点对比有问题账套报错处

第 40 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第41页 共58页前后sql语句涉及的表或数据对象内容有何差别。根据对比结果确定出错数据,对问题账套进行修改即可。

在实际处理问题过程中,应用这种办法通常都能有效解决此类问题。

3.2 隐式的数据错误问题的解决

对于这类问题,通常的解决办法是:

再现该存在问题的操作(在软件界面操作),同时实时查看后台的跟踪结果,查找出实现该功能sql语句所操作的数据表或数据对象。

在实际处理问题过程中,通常遇到的情况都是:存在问题操作涉及的明细表数据正确,而汇总表数据有错,这时,利用明细表中数据来修改汇总表中的对应数据即可。

3.3 涉及存储过程、视图、触发器问题的解决

在处理以上两类问题的时候,还会遇到事件探查器跟踪出的结果涉及存储过程、视图、触发器等,这时不能单纯应用以上办法来解决,而是要进一步研究该存储过程、视图、触发器等所涉及的具体表或数据对象,往往这些对象涉及的表或数据对象比较繁多复杂,因此要对此类对象的SQL语句进行深入分析,再确定解决办法。

在SQLServer的查询分析器中执行系统存储过程“sp_helptext

对象名”可以查询具体存储过程、视图、触发器的SQL语句内容。

本章小结:

初次使用事件探查器时,一般用默认跟踪模板即可。随着使用经验的积累,可以更为深入的探索事件探查器的一些有用的高级功能。

第 41 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第42页 共58页 本专刊主要讲解了SQL语句的用法,其实很多功能都可以在SQLServer的企业管理器中,通过可视化的操作可实现相同的功能。但在有些情况下,直接使用SQL语句比SQLServer企业管理器的可视化操作更为灵活高效。这一点在今后的实践中会有深刻体会。

掌握了SQL的基本语法后,在今后的工作学习中要不断实践,一定要将SQLServer的联机帮助作为自己最好的老师。

衷心祝你早日成为SQLServer专家!

附 录

组成数据库的对象

A:表(table)具体组织和存储数据的对像,由列和行组成.

B:主键(primary key)

C:外键(foreign key)

D:视图(view)从一个或几个基本表中根据用户需要而做成一个虚表.

1:表中一列或多列的组合,它本身不是本表的主键,而是另外一个表的主键.[一对多关系]

2:外键是两个表发生关系一个纽带.

1:表中一列或多列的组合,其值唯一确定表的一行.

2:主键不能重复

3:作为主键各列都不能为空.

1:行和列顺序可以是任意的.在同一个表中列名必须是唯一的.

2:在同一个数据库里面表名也必须要是唯一.

第 42 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第43页 共58页

1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据

2:视图只在刚刚打开的一瞬间,通过定义从表中搜集数据,并展现给用户

E:约束(constraint)

F:默认值(default)

G:事务(Transaction)

1:在关系型数据库里面一般使用“事务“来处理用户提交的修改表和数据的操作

2:事务就是一次性完成的一组数据的操作.

3:事务的持征:位于事务中的操作要么全部都做,要么全部取消,从而维护了数据库中数据的合理性.

4:关系数据库中一般按照先写日志的方法进行事务操作.即:在实施事务之前先将要进行操作的记录写入日志,再进行实际的数据修改.

5:是记录关系数据修改的情况的笔记.

1:在向表中插入数据时,为没有指定数据的列提供一个默认的数据

1:对表中各列的取值范围进行限制,以确保表中数据的合理有效.

第 43 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第44页 共58页 6:在用户对数据库实施之前,sql会把两种形式的情况写入日志.

1:实施事务之间的数据状态.

2:实施事务之后的数据状态.

当事务由于中途被破坏时,sqlserver会利用日志记录把数据恢复成实施事务之前的数据状态,即撤消事务(回滚);

如果事务顺利的执行则把数据恢复成实施事务之后的状态,即执行事务(前滚).

H:规则(rule)

I:索引(index)

J:存储过程(store procedure)

一组经过编译好的可以重复使用的sql代码.存储过程是在服务器中执行,用户可以调用存储过程并接收存储过程返回的结果.

K:触发器(trigger)

一种特殊的存储过程.

1:同约束一样,对特定的列进行限制,如:单价*数量=总额

1:提供一种无需扫描整张表就能实现对数据快速访问的途径.可以使用索引来优化查询.[用索引可以实现排序]

1:由于存储过程是存储在服务器,所有可以让每一个客户重复使用,减少sql代码书写量.

2:由于存储过程是事先编译好的sql代码,所以在执行时,并不做语法检验,可以大大提高sql语句的执行效率.

1:触发器与表相关.

第 44 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第45页 共58页

2:当用户对指定的表进行某种操作时,触发器会自动执行,去做它里面sql代码

L:数据类型(data type)

M:日志(log)

1:sql server使用日志记载用户对数据库进行的一系列的操作.日志是维护数据库完整性的重要工具.sql server遵守先写日志再对数据库进行操作.所以某一天,如果数据库损坏,但可以通过日志进行恢复.

SQLSERVER系统组成

1:sql server系统数据库.

A:master:最重要的一个数据库.保存了:

服务器的用户名密码.

服务器的配置信息

使用的数据类型

错误信息

系统或者用户建立的所有对像

说明:由于master数据库比较重要所以不要在里面建表,不要修改里面的任何内容.

1:两种类型:系统数据类型,用户自定义数据类型.

2:系统数据类型:int,float,char,varchar,text[备注,工作简历],image[存储图像]

第 45 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第46页 共58页 B:tempdb:临时数据库

1:记录所有的临时表格或者数据.

2:tempdb是一个全局资源,任何连接到sql server都可以使用.

3:该数据库所放有的数据全部是临时,这就是说当sql server服务停止之后,所有数据将会消失

C:model数据库:模板数据库.

1:是建立新的数据库一个样式.

2:当用户建立一个数据库的时候,首先要从model数据库里面复制所有的表.

D:msdb数据库:

主要被sql server agent服务用于操作作业调度以及管理报警.

2:系统表

A:服务器级系统表:[master数据库里面]

1:sysdatabases:记录所有的数据库的相关信息

2:sysmessages:记录了系统错误和警告信息

3:syslangues:记录了服务器能够识别的语言

4:sysconfigures:记录了服务器配置情况

5:systype:记录了服务器所有数据类型

第 46 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第47页 共58页 B:数据库级系统表:[保存在不同的数据库里面]

1:sysbojects:所有数据库的对像的相关资料.[类型:u:表,V:视图,P:存储过程,tr:触发器]

2:sysusers:所有数据库的用户的信息.

3:syscolumns:所有数据库表中的列.

3:系统的存储过程:

存放在MASTER数据库,以SP_开头,如:

1:sp_help 表名:查看表的信息:

2:sp_renamedb 旧名字,新名字:把数据库更名.

pubs,northwind.

Transact_SQL小手册

数据操作

SELECT --从数据库表中检索数据行和列

INSERT --向数据库表添加新数据行

DELETE --从数据库表中删除数据行

UPDATE --更新数据库表中的数据

4:示列数据库:

数据定义

第 47 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第48页 共58页 CREATE TABLE --创建一个数据库表

DROP TABLE --从数据库中删除表

ALTER TABLE --修改数据库表结构

CREATE VIEW --创建一个视图

DROP VIEW --从数据库中删除视图

CREATE INDEX --为数据库表创建一个索引

DROP INDEX --从数据库中删除索引

CREATE PROCEDURE --创建一个存储过程

DROP PROCEDURE --从数据库中删除存储过程

CREATE TRIGGER --创建一个触发器

DROP TRIGGER --从数据库中删除触发器

CREATE SCHEMA --向数据库添加一个新模式

DROP SCHEMA --从数据库中删除一个模式

CREATE DOMAIN --创建一个数据值域

ALTER DOMAIN --改变域定义

DROP DOMAIN --从数据库中删除一个域

数据控制

GRANT --授予用户访问权限

DENY --拒绝用户访问

REVOKE --解除用户访问权限

事务控制

COMMIT --结束当前事务

ROLLBACK --中止当前事务

SET TRANSACTION --定义当前事务数据访问特征

程序化SQL

第 48 页 共 58 页 2021年x月x日

书山有路勤为径,学海无涯苦作舟

页码:第49页 共58页 DECLARE --为查询设定游标

EXPLAN --为查询描述数据访问计划

OPEN --检索查询结果打开一个游标

FETCH --检索一行查询结果

CLOSE --关闭游标

PREPARE --为动态执行准备SQL 语句

EXECUTE --动态地执行SQL 语句

DESCRIBE --描述准备好的查询

局部变量

declare @id char(10)

--set @id = '10010001'

select @id = '10010001'

全局变量

IF ELSE

declare @x int @y int @z int

select @x = 1 @y = 2 @z=3

if @x > @y

print 'x > y' --打印字符串'x > y'

else if @y > @z

print 'y > z'

else print 'z > y'

必须以@@开头

CASE

第 49 页 共 58 页