提供7*24专业Sybase数据库远程及现场技术支持,Sybase ASE及Sybase SQL Anywhere数据库修复服务,
请联系电话: (微信),QQ: 289965371!
We supply technical support for Sybase ASE and Sybase SQL Anywhere, also have many years of experience in recovering data from damanged Sybase devices.
Please contact us:
Phone:
Wechat: 13811580958
QQ: 289965371 联系我们获取数据库技术支持!
Email: 289965371@qq.com
扫描下方微信,联系我们:
扫描雨翰数据恢复官方微信获取专业数据库恢复服务

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从https://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站https://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 联系我们获取数据库技术支持!
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

使用控制流语言

可以在批处理和存储过程中将控制流语言用于交互式语句。 15-1 列 出了控制流和相关关键字及其功能。

15-1:控制流和相关关键字

image

关键字 功能

image

if 定义条件执行。

image

…else 定义当 if 条件为假时的替代执行。

image

case 使用 when…then 语句代替 if…else 定义条件表达式。

image

begin 语句块的起点。

image

end 语句块的终点。

image

while 条件为真时重复执行语句。

image

break 从下一外层 while 循环结束处退出。

image

…continue 重新启动 while 循环。

image

declare 声明局部变量。

image

goto label 跳转到语句块中的 label: 位置。

image

return 无条件退出。

image

waitfor 设置命令执行的延迟。

image

print 在用户屏幕上输出用户定义的消息或局部变量。

image

image

raiserror 在用户屏幕上输出用户定义的消息或局部变量,并在 全局变量 @@ error 中设置系统标志。

/* comment */

--comment

Transact-SQL 语句中任意位置插入注释。


if ...else


关键字 if (无论有没有协同的 else)引入确定是否执行下一语句的条件。 如果条件满足,也就是说条件返回 TRUE,则执行 Transact-SQL 语句。

else 关键字引入了一个替代 Transact-SQL 语句,在 if 条件返回 FALSE 时 执行该语句。

if else 的语法为:

if

boolean_expression statement

[else

[if boolean_expression] statement ]


布尔表达式返回 TRUE FALSE。它可以包括列名、常量、使用算术运 算符或逐位运算符连接的列名和常量的任意组合、或子查询 (只要子 查询返回单个)。如果布尔表达式包含 select 语句,则 select 语句必须用 小括号括起来,并且必须返回单个值。

以下示例只使用了 if

if exists (select postalcode from authors where postalcode = "94705")

print "Berkeley author"

如果 authors 表中的一个或多个邮政编码的值为 “94705”,则输出消息 “Berkeley author”。因为使用了关键字 exists,所以此示例中的 select 语 句返回单个值, TRUE FALSEexists 关键字在此的功能与其在子查 询中的功能相同。请参见 5 章 “子查询:在其它查询中使用查询

以下示例使用了 if else,用于测试是否存在 ID 号大于 50 的用户定义 对象。如果存在这些用户对象,则 else 子句选择其名称、类型和 ID 号。

if (select max(id) from sysobjects) < 50

print "There are no user-created objects in this database."

else

select name, type, id from sysobjects where id > 50 and type = "U"

(0 rows affected)


name

type

id

------------

----

---------

authors

U

16003088

publishers

U

48003202

roysched

U

80003316

sales

U

112003430

salesdetail

U

144003544

titleauthor

U

176003658

titles

U

208003772

stores

U

240003886

discounts

U

272004000

au_pix

U

304004114

blurbs

U

336004228

friends_etc

U

704005539

test

U

912006280

hello

U

1056006793


(14 rows affected)

if...else 结构经常用在存储过程中,测试某些参数的存在性。


if 测试可嵌套在其它 if 测试中,在另一 if 中或在 else 后。if 测试中的表达 式只能返回单个值。同样,每个 if...else 结构可以有一个 if 语句和一个 else 语句。要包括多个选择语句,请使用 begin...end 关键字。根据每个 if...else 结构所包括的 select 语句 (或其它语言结构)的复杂性,可嵌套 if 测试的最大数目也不同。


case 表达式


case 表达式简化了许多条件 Transact-SQL 结构。无需使用一系列 if 语 句, case 表达式允许使用一系列条件,在条件满足时返回适当的值。 case 表达式符合 ANSI SQL

使用 case 表达式,可以:

简化查询并编写更有效的代码

在数据库所使用的格式 (如 int)和应用程序所使用的格式 (如 char) 之间转换数据

返回列列表中的第一个非空值

编写避免除以零的查询

比较两个值,值不匹配时返回第一个值,值匹配时返回 NULL

case 表达式包括关键字 casewhenthencoalesce nullifcoalesce

nullif case 表达式的缩写形式。请参见 《参考手册:命令》。


在替代表示中使用 case 表达式

使用 case 表达式可以采用对用户更有意义的方式表示数据。例如,pubs2 数据库在 titles 表的 contract 列存储 1 0 来指示书籍交易的状态。但是, 在您的应用程序代码中或用于用户交互时,最好使用词语 “Contract” 或 “No Contract”来指示书籍的状态若要使用替代表示从 titles 表中选 择类型,请使用以下命令:

select title, "Contract Status" = case


end

when contract = 1 then "Contract" when contract = 0 then "No Contract"

from titles

title Contract Status

----- ---------------

The Busy Executive’s Database Guide Contract


Cooking with Computers:Surreptitio Contract You Can Combat Computer Stress! Contract

. . .

The Psychology of Computer Cooking No Contract

. . .

Fifty Years in Buckingham Palace Contract Sushi, Anyone? Contract


(18 rows affected)


case 和除数为零


利用 case 表达式,可以编写避免除数为零 (称为意外排除)的查询。 以下示例用 advance 列去除每本书的 total_sales 列。当查询试图用 advance

(0.00) 去除 title_id MC2222 total_sales (2032) 时,查询会导致除数为零:

select title_id, total_sales, advance, total_sales/advance from titles

title_id

total_sales

advance

-------

-----------

---------

------

BU1032

4095

5,000.00

0.82

BU1111

3876

5,000.00

0.78

BU2075

18722

10,125.00

1.85

BU7832

4095

5,000.00

0.82


Divide by zero occurred.

可以使用 case 表达式,通过不允许在等式中包括零来避免出现这种情况。 在此示例中,查询碰到 0 时,返回预定义的值,而不是执行此除法:

select title_id, total_sales, advance, "Cost Per Book" = case


end

when advance != 0

then convert(char, total_sales/advance) else "No Books Sold"

from titles

title_id


total_sales


advance


Cost Per Book

--------

-----------

----------

-------------

BU1032

4095

5,000.00

0.82

BU1111

3876

5,000.00

0.78

BU2075

18722

10,125.00

1.85

BU7832

4095

5,000.00

0.82

MC2222

2032

0.00

No Books Sold

MC3021

22246

15,000.00

1.48


MC3026

NULL

NULL

No

Books

Sold

. . .

TC3218

375

7,000.00

0.05

TC4203

15096

4,000.00

3.77

TC7777


(18 rows


affected)

4095

8,000.00

0.51

title_id MC2222 的除数为零情况不再会阻止查询运行。同样, MC3021

的空值也不会阻止查询的运行。

如果除数的求值结果为常量表达式,则 case 无法避免除数为 0 的错误, 因为 Adaptive Server 计算常量表达式,然后才执行 case 逻辑。这有时会 导致除数为零。解决办法:

使用 nullif()。例如:

(x/nullif(@foo.0)0

包括列值,以便它们相互约去,强制 Adaptive Server 为每行计算表 达式。例如:

(x/(@foo + (col1 - col1))


case 表达式中使用 rand 函数

引用 randgetdate 等函数的表达式在每次对它们求值时将生成不同的 值。当您在某些 case 表达式中使用这些表达式时上述情况可能造成意 外结果。例如, SQL 标准指定,具有以下形式的 case 表达式:

case expression

when value1 then result1 when value2 then result2 when value3 then result3

...

end

与以下形式的 case 表达式等效:

case expression

when expression=value1 then result1 when expression=value2 then result2 when expression=value3 then result3

...

end


此定义显式要求在检查的每一 when 子句中反复对表达式求值。此 case 表达式的定义将影响引用诸如 rand 之类函数的 case 表达式。例如,以 下 case 表达式:

select

CASE convert(int, (RAND() * 3)) when 0 then "A"

when 1 then "B" when 2 then "C" when 3 then "D"

else "E"

end

根据 SQL 标准定义为与以下内容等效:

select CASE


end

when convert(int, (RAND() * 3)) = 0 then "A" when convert(int, (RAND() * 3)) = 1 then "B" when convert(int, (RAND() * 3)) = 2 then "C" when convert(int, (RAND() * 3)) = 3 then "D"

else "E"

在此形式中,为每一 when 子句都生成一个新的 rand 值,并且 case 表达 式频繁生成结果 “E”。


case 表达式结果


用于确定 case 表达式的数据类型的规则所基于的规则与确定 union 操作 中列的数据类型的规则相同。 case 表达式有一系列替代结果表达式 (如 下示例中的 R1 , R2, ..., Rn),它们是用 then else 子句来指定的。例如:

case

when search_condition1 then R1

when search_condition2 then R2

...

else Rn

end

结果表达式 R1 , R2 , ..., Rn 的数据类型用于确定整个 case 的数据类型。 union 列的数据类型用于指定 n 个表,并将表达式 R1 , R2, ..., Rn 作为第 i 列,其确定数据类型的规则与确定 case 表达式的数据类型的规则相同。 case 数据类型的确定方式与以下查询中的确定方式相同:

select...R1...from ... union select...R2...from...


union...

...

select...Rn...from...

并非所有数据类型都是兼容的,如果指定两个不兼容的数据类型 (例 如, char int), Transact-SQL 查询将会失败。请参见 《参考手册:构 件块》。


case 表达式和 set ansinull

如果您启用 set ansinull 并在具有类似以下结构的查询中包括 when NULL

子句,则 case 表达式可能会生成不同的空值结果:

select CVT =

case case_expression when NULL then 'YES' else 'NO'

end from A

如果将 ansinull 设置为 off (缺省值),这些 case 表达式会对 NULL 值进 行匹配,并且谓词会对 NULL 值求值为 true (与查询处理器对包含 NULL 值的 where 子句进行求值的方式相同)。如果将 ansinull 设置为 on,则 case 表达式无法比较 NULL 值,会将谓词求值为 false。例如:

select CVT = case advance

when NULL then 'YES' else 'NO'

end,

advance from titles

--- ------------------------ NO 5,000.00

NO 15,000.00

YES NULL

NO 7,000.00

NO 8,000.00

YES NULL

NO 7,000.00

但是,如果启用 set ansinull 并运行同样的查询, case 表达式会在遇到

NULL 值时返回 no 值:

set ansinull on


select CVT = case advance

when NULL then 'YES'



end,

else 'NO'

advance from titles CVT advance

--- ------------------------ NO 5,000.00

NO 15,000.00

NO NULL

NO 7,000.00

NO 8,000.00

NO NULL

NO 7,000.00

请参见 《参考手册:命令》。


case 表达式要求至少返回一个非空值

至少有一个 case 表达式的结果必须返回非空值。以下查询:

select price, case

when title_id like "%" then NULL when pub_id like "%" then NULL

end from titles

返回以下错误消息:

All result expressions in a CASE expression must not be NULL


确定结果集


使用 case 表达式可以测试确定结果集的条件。 语法为:

case

when search_condition1 then result1

when search_condition2 then result2

. . .

when search_conditionn then resultn

else resultx

end

其中, search_condition 是逻辑表达式, result 是表达式。


如果 search_condition1 为真,则 case 的值为 result1 ;如果 search_condition1 为假,则检查 search_condition2。如果 search_condition2 为真,则 case 的值为 result2,依此类推。如果搜索条件都为假,则 case 的值为 resultxelse 子句是可选的。如果没有使用它,则缺省为 else NULLend 指示 case 表达式结束。

每个书店的每本书的总销售额都保存在 salesdetail 表中。要显示一系列 范围的书籍销售额,可以跟踪每个书店中每本书的销售额:

销售量小于 1000 的书籍 (低销售额的书籍)

销售量在 1000 3000 之间的书籍 (中等销售额的书籍)

销售量大于 3000 的书籍 (高销售额的书籍) 编写以下查询:

select stor_id, title_id, qty, "Book Sales Catagory" = case


end

when qty < 1000

then "Low Sales Book"

when qty >= 1000 and qty <= 3000 then "Medium Sales Book"

when qty > 3000

then "High Sales Book"

from salesdetail group by title_id

stor_id

title_id

qty

Book Sales Catagory

-------

--------

----

------------------

5023

BU1032

200

Low

Sales

Book

5023

BU1032

1000

Low

Sales

Book

7131

BU1032

200

Low

Sales

Book

. . .

7896

TC7777

75

Low

Sales

Book

7131

TC7777

80

Low

Sales

Book

5023

TC7777

1000

Low

Sales

Book

7066

TC7777

350

Low

Sales

Book

5023

TC7777

1500

Medium Sales Book

5023

TC7777

1090

Medium Sales Book


(116 rows affected)


以下示例根据 author 的版税率 ( royaltyer ) titleauthor 表中选择 titles,并 且为每个 title 分配一个高的、中等的或低的版税:

select title, royaltyper, "Royalty Category" = case

when (select avg(royaltyper) from titleauthor tta

where t.title_id = tta.title_id) > 60 then "High Royalty" when (select avg(royaltyper) from titleauthor tta

where t.title_id = tta.title_id) between 41 and 59 then "Medium Royalty"

else "Low Royalty"

end

order by title

title


royaltyper


royalty Category

-------

----------

----------------

But Is It User Friendly?

100

High Royalty

Computer Phobic and Non-Phobic Ind

25

Medium Royalty

Computer Phobic and Non-Phobic Ind

75

Medium Royalty

Cooking with Computers:Surreptiti

40

Medium Royalty

Cooking with Computers:Surreptiti

60

Medium Royalty

Emotional Security:A New Algorith

100

High Royalty

. . .

Sushi, Anyone?

40

Low Royalty

The Busy Executive’s Database Guide

40

Medium Royalty

The Busy Executive’s Database Guide

60

Medium Royalty

The Gourmet Microwave

75

Medium Royalty

You Can Combat Computer Stress!

100

High Royalty

order by title

title


royaltyper


royalty Category

-------

----------

----------------

But Is It User Friendly?

100

High Royalty

Computer Phobic and Non-Phobic Ind

25

Medium Royalty

Computer Phobic and Non-Phobic Ind

75

Medium Royalty

Cooking with Computers:Surreptiti

40

Medium Royalty

Cooking with Computers:Surreptiti

60

Medium Royalty

Emotional Security:A New Algorith

100

High Royalty

. . .

Sushi, Anyone?

40

Low Royalty

The Busy Executive’s Database Guide

40

Medium Royalty

The Busy Executive’s Database Guide

60

Medium Royalty

The Gourmet Microwave

75

Medium Royalty

You Can Combat Computer Stress!

100

High Royalty

from titles t, titleauthor ta where ta.title_id = t.title_id


(25 rows affected)


case 和值比较


这种形式的 case 用于值比较。它只允许进行两个值的等同性检查;而不 允许其它的比较。

语法为:

case valueT

when value1 then result1

when value2 then result2

. . .

when valuen then resultn

else resultx end


其中, value result 是表达式。

如果 valueT 等于 value1,则 case 的值为 result1。如果 valueT 不等于 value1,则 valueT value2 相比较。如果 valueT 等于 value2,则 case 的 值为 result2,依此类推。如果 valueT 的值不等于 value1 valuen,则 case 的值为 resultx

至少有一个结果必须是非空值。所有的结果表达式都必须是兼容的。同 样,所有的 values 也必须都是兼容的。

上述语法等价于:

case

when valueT = value1 then result1

when valueT = value2 then result2

. . .

when valueT = valuen then resultn

else resultx

end

这与用于 case 和搜索条件的格式相同 (请参见 442 页的 “确定结 果集 )。

以下示例从 titles 表中选择 title pub_id,并基于 pub_id 指定每本书的出 版社:

select title, pub_id, "Publisher" = case pub_id

when "0736" then "New Age Books" when "0877" then "Binnet & Hardley"

when "1389" then "Algodata Infosystems" else "Other Publisher"

end

from titles order by pub_id

title pub_id Publisher

----- ------ -------------

Life Without Fear

0736

New

Age

Books

Is Anger the Enemy?

0736

New

Age

Books

You Can Combat Computer

0736

New

Age

Books

. . .

Straight Talk About Computers

1389

Algodata Infosystems

The Busy Executive’s Database

1389

Algodata Infosystems

Cooking with Computers:Surre

1389

Algodata Infosystems

(18 rows affected)


这等价于以下使用 case 和搜索条件语法的查询:

select title, pub_id, "Publisher" = case

when pub_id = "0736" then "New Age Books" when pub_id = "0877" then "Binnet & Hardley"

when pub_id = "1389" then "Algodata Infosystems" else "Other Publisher"

end

from titles order by pub_id


coalesce


coalesce 检查一系列值 (value1, value2, ..., valuen) 并返回第一个非空值。

coalesce 的语法为:

coalesce(value1, value2, ..., valuen)

其中, value1 , value2 , ..., valuen 是表达式。如果 value1 为非空值,则 coalesce 的值为 value1 ;如果 value1 为空值,则检查 value 2,依此类推。 继续检查,直到找到非空值为止。第一个非空值成为 coalesce 的值。

使用 coalesce 时, Adaptive Server 在内部将其转换为:

case

when value1 is not NULL then value1

when value2 is not NULL then value2

. . .

when valuen-1 is not NULL then valuen-1

else valuen

end

valuen-1 指倒数第二个值,在最后的值 valuen 前面。

以下示例使用 coalesce 来确定书店订购的书籍数量是低 (大于 100 但小 于 1000)还是高 (大于 1000):

select stor_id, discount, "Quantity" = coalesce(lowqty, highqty)

from discounts

stor_id

discount

Quantity

-------

--------

---------

----

NULL

10.500000

NULL

NULL

6.700000

100

NULL

10.000000

1001

8042


(4 rows


affected)

5.000000

NULL


nullif


使用 nullif 可查找以编码形式存储的任何遗失的、未知的或不适用的信 息。例如,以前有时将未知值作为 -1 存储。使用 nullif,您可以用空值 替代 -1 值,并获得 Transact-SQL 定义的空值行为。语法为:

nullif(value1, value2)

如果 value1 等于 value2nullif 将返回 NULL。如果 value1 不等于 value2nullif 将返回 value1value1 value2 是表达式,并且其数据类 型必须是可比的。

使用 nullif 时, Adaptive Server 在内部将其转换为:

case

when value1 = value2 then NULL else value1

end

例如, titles 表使用值 “UNDECIDED”来表示还没有确定类别的书。以 下查询对 titles 表执行书籍类型的搜索;任何类型为 “UNDECIDED”的 书籍都作为类型 NULL 返回 (以下输出出于显示目的重新设置了格式):

select title, "type"= nullif(type, "UNDECIDED")

from titles

title type

----- --------

The Busy Executive’s Database Guide business Cooking with Computers:Surreptiti business You Can Combat Computer Stress! business

. . .

The Psychology of Computer Cooking NULL Fifty Years in Buckingham Palace K trad_cook Sushi, Anyone? trad_cook


(18 rows affected)

The Psychology of Computing 作为 “UNDECIDED”存储在表中,但查询 将其作为类型 NULL 返回。


begin...end


begin end 关键字将一系列语句包含在其中,以使控制流结构 (如 if...else)将其作为一个单元进行处理。涵括在 begin end 中的一系列语 句称为一个语句块

begin...end 的语法为:

begin


end

例如:

statement block

if (select avg(price) from titles) < $15 begin

update titles

set price = price * 2


select title, price from titles

where price > $28 end

没有 begin endif 条件只应用于第一个 Transact-SQL 语句。第二个语 句的执行独立于第一个语句。

begin...end 块可以嵌套在其它 begin...end 块中。


while break...continue

while 设置重复执行语句或语句块的条件。只要指定条件为真,语句就 会重复执行。

语法为:

while boolean_expression statement

此例中,只要平均价格小于 $30,就重复执行 select update 语句:

while (select avg(price) from titles) < $30 begin

select title_id, price from titles

where price > $20 update titles

set price = price * 2 end


(0 rows affected)


title_id price

------ -------

PC1035 22.95

PS1372 21.59

TC3218 20.95


(3 rows affected)

(18 rows affected)

(0 rows affected)

title_id

price

------

-------

BU1032

39.98

BU1111

23.90

BU7832

39.98

MC2222

39.98

PC1035

45.90

PC8888

40.00

PS1372

43.18

PS2091

21.90

PS3333

39.98

TC3218

41.90

TC4203

23.90

TC7777

29.98

(12 rows affected)

(18 rows affected)

(0 rows affected)

break continue 控制 while 循环中语句的执行。 break 导致从 while 循环 中退出。执行在以 end 关键字作为循环结束标记之后的所有语句。continue 导致 while 循环重新启动,并跳过此循环内 continue 之后的所有语句。 break continue 经常由 if 测试激活。

break...continue 的语法为:

while boolean expression

begin

statement [statement]... break [statement]... continue [statement]...

end


以下示例中使用 whilebreakcontinue if 来撤消上述示例所导致的涨 价。只要平均价格高于 $20,其价格均减半。然后选择最高价格。如果 平均价格低于 40 美元,则退出 while 循环;否则将试图继续执行循环。 仅在平均价格高于 20 美元时, continue 才允许执行 printwhile 循环结 束后,将输出一条消息和价格最高的书籍列表。

while (select avg(price) from titles) > $20 begin

update titles

set price = price / 2

if (select max(price) from titles) < $40 break

else

if (select avg(price) from titles) < $20 continue

print "Average price still over $20"

end


select title_id, price from titles where price > $20

print "Not Too Expensive" (18 rows affected)

(0 rows affected)

(0 rows affected)

Average price still over $20 (0 rows affected)

(18 rows affected)

(0 rows affected)


title_id price

-------- ------- PC1035 22.95

PS1372 21.59

TC3218 20.95


(3 rows affected)

Not Too Expensive

如果嵌套有两个或多个 while 循环,则 break 退出到下一外层循环。首先, 执行循环内部 end 之后的所有语句。然后,重新启动外部循环。


declare 和局部变量

局部变量用 declare 关键字来声明、命名和指定类型,并用 select 语句为 其赋初始值;这必须发生在同一个批处理或过程中。

请参见 458 页的 “局部变量


goto


goto 关键字导致无条件地分岔转到用户定义标签。 goto 和标签可用于存 储过程和批处理。标签的名称必须符合标识符规则,并且必须在首次给 出时后接冒号。当与 goto 一起使用时,它不后接冒号。

goto 的语法为:

label:

goto label

以下示例使用 goto 和标签、 while 循环和一个作为计数器的局部变量:

declare @count smallint select @count = 1 restart:

print "yes"

select @count = @count + 1 while @count <=4

goto restart

为了避免 goto 和标签之间的无穷循环,goto 通常依赖于 while if 测试, 或者其它一些条件。


return


return 关键字无条件地退出批处理或过程。它可用在批处理或过程中的 任何位置。用于存储过程时, return 可以接收可选的参数以向调用者返 回一个状态。 return 之后的语句不会执行。

语法为:

return [int_expression]

以下存储过程使用 return 以及 if...else begin...end

create procedure findrules @nm varchar(30) = null as if @nm is null

begin

print "You must give a user name"


return end

else begin

select sysobjects.name, sysobjects.id, sysobjects.uid

from sysobjects, master..syslogins where master..syslogins.name = @nm

and sysobjects.uid = master..syslogins.suid and sysobjects.type = "R"

end

如果调用 findrules 时没有指定用户名参数,则 return 关键字将导致在将 消息发送给用户屏幕之后退出此过程。如果指定了用户名,则从相应的 系统表中检索用户所拥有的规则名称。

return 类似于在 while 循环中使用的 break 关键字。

可以在 17 “使用存储过程”中找到使用返回值的示例


print


上述示例中用到的 print 关键字在用户屏幕上显示用户定义的消息或局部 变量的内容。必须在使用局部变量的批处理或过程中声明它。消息可以 长达 255 个字节。

语法为:

print {format_string | @local_variable |

@@global_variable} [,arg_list]

例如:

if exists (select postalcode from authors where postalcode = "94705")

print "Berkeley author"

以下是使用 print 来显示局部变量内容的方法:

declare @msg char(50)

select @msg = "What’s up, doc?" print @msg

print 可识别要输出字符串中的占位符。格式字符串最多可包含 20 个任 意顺序的唯一占位符。将消息文本发送到客户端时,使用 format_string 后接参数的格式化内容替换这些占位符。


为了在用其它语法结构将格式字符串转换为某种语言时可以对参数重新 排序,要对占位符进行编号。参数所用占位符的显示形式如下:%nn!。 它由百分比符号 (%) 和后接的 1 20 之间的整数以及后接的感叹号 (!) 组成。整数表示原始语言中占位符在字符串中的位置。“%1!”是原始 版本中第一个参数,“%2!”是第二个参数,依此类推。指示参数的位 置可以使翻译正确,即使参数出现在目标语言中的顺序与其在源语言中 的顺序不同。

例如,假定以下是一条英文消息:

%1! is not allowed in %2!.

此消息的德文版本是:

%1! ist in %2! nicht zulässig.

此消息的日文版本是:

15-1:日文消息

image


15-1 显示了一个日文短语,在该短语中的不同位置包含字符 “%1!”。 在此示例中,“%1!”在英文、德文和日文中表示同一个参数,“%2!” 在这三种言中也都表示单个参数。

虽然不必按数值顺序使用占位符,但在格式字符串中使用占位符时不能 跳过占位符编号。例如,不允许将占位符 1 3 放在一个格式字符串中,

却不占位符 2 也放在此字符串中。

可选的 arg_list 可以是一系列变量或常量。参数可以是除 text image 以 外的任何数据类型;在出现在最终的消息之前,它将被转换为 char 数据 类型。如果没有提供任何参数列表,则格式字符串必须是要输出的没有 任何占位符的消息。

替换后, format_string 加上所有参数的最大输出字符串长度是 512 个 字节。


raiserror


raiserror 在用户屏幕上显示用户定义的错误或局部变量消息,并设置系 统标志来记录已出现过错误这一情况。使用 print 时必须在使用其的批处 理或过程中声明局部变量。消息可以长达 255 个字节。


raiserror 的语法为:

raiserror error_number

[{ format_string | @local_variable}] [, arg_list] [extended_value = extended_value [{, extended_value = extended_value}...]]

error_number 放置在全局变量 error@@ 中,它存储 Adaptive Server 最近 生成的错误号。用户定义的错误消息的错误号必须大于 17,000。如果 error_number 介于 17,000 19,999 之间,并且 format_string 缺失或为空 ( “ ” ),则 Adaptive Server master 数据库的 sysmessages 表中检索错 误消息文本。这些错误消息主要供系统过程使用。

The length of the format_string 本身的长度限制在 255 个字节以内; format_string 加上所有参数的最大输出长度限制在 512 个字节以内。 raiserror 消息所用的局部变量必须是 char varcharformat_string 或变 量是可选的;如果不包括它们,则 Adaptive Server 使用缺省语言的 sysusermessages 中相应 error_number 的消息。使用 print 可以替代由 format_string 中的 arg_list 所定义的变量或常量。

可以定义扩展错误数据以供 Open Client 应用程序使用(在 raiserror 中包 括 extended_values 时)。有关扩展错误数据的详细信息,请参见 Open Client 文档或 《参考手册:命令》。

如果希望将错误编号存储在 error@@ 中,请使用 raiserror,而不要使用 print。以下示例在名为 findrules 的过程中使用 raiserror

raiserror 99999 "You must give a user name"

所有用户定义错误消息的严重级是 16,表示用户已经犯了非致命错误。


print raiserror 创建消息

可用 sp_getmessage sysusermessages 中调用使用 print raiserror 的消 息。使用 sp_addmessage 创建一组消息。

以下示例使用 sp_addmessagesp_getmessage print sysusermessages 中创建一条英文和德文消息、检索该消息并将其用于用户定义的存储过 程,然后输出该消息:

/*

** Install messages

** First, the English (langid = NULL)

*/

set language us_english go

sp_addmessage 25001,

"There is already a remote user named ’%1!’ for remote


server ’%2!’." go

/* Then German*/ sp_addmessage 25001,

"Remotebenutzername ’%1!’ existiert bereits auf dem Remoteserver ’%2!’.","german"

go

create procedure test_proc @remotename varchar(30),

@remoteserver varchar(30)

as

declare @msg varchar(255) declare @arg1 varchar(40)

/*

** check to make sure that there is not

** a @remotename for the @remoteserver.

*/

if exists (select *

from master.dbo.sysremotelogins l, master.dbo.sysservers s

where l.remoteserverid = s.srvid and s.srvname = @remoteserver

and l.remoteusername = @remotename)

begin

exec sp_getmessage 25001, @msg output select @arg1=isnull(@remotename, "null") print @msg, @arg1, @remoteserver

return (1)

end return(0) go

也可以将用户定义的消息绑定到约束,如 281 页的 “为约束创建错 误消息”中所述。

要删除用户定义的消息,请使用 sp_dropmessage。要更改消息,首先使 用 sp_dropmessage 将其删除,然后使用 sp_addmessage 再次添加它。


waitfor


waitfor 关键字指定执行语句块、存储过程或事务的特定时间、时间间隔 或事件。

语法为:

waitfor {delay "time" | time "time" | errorexit | processexit | mirrorexit}


其中, delay 'time' 指示 Adaptive Server 要等到指定的时间段已经过去。 time 'time' 指示 Adaptive Server 要等到指定的时间,它使用 datetime 的有 效数据格式。

但是,不能指定日期 — 不允许指定 datetime 值的日期部分。用 waitfor time waitfor delay 指定的时间可包括小时、分钟和秒 — 最多为 24 小 时。使用格式 “hh:mm:ss”。

例如,以下命令指示 Adaptive Server 等到下午 4:23

waitfor time "16:23"

以下命令指示 Adaptive Server 等待 1 小时 30 分钟:

waitfor delay "01:30"

有关 time 值的格式的论述,请参见 211 页的 “输入时间

errorexit 指示 Adaptive Server 一直等到进程异常终止。 processexit 一直 等到进程因任何原因终止。 mirrorexit 一直等到读取或写入镜像设备操 作失败。

可将 waitfor errorexit 用于注销异常终止进程的过程,从而释放系统资源, 避免被受影响的进程占用。要找到受影响的进程,使用 sp_who 来检查 sysprocesses 表。

以下命令指示 Adaptive Server 一直等到下午 2:20。然后,它用走下一步 棋来更新 chess 表,并执行名为 sendmessage 的存储过程,这会在 Judy 的一个表中插入一条消息,通知她 chess 表中现在包含新的走棋。

begin

waitfor time "14:20" insert chess(next_move) values("Q-KR5")

execute sendmessage "Judy" end

要在 10 秒钟之后而不是等到 2:20 Judy 发送消息,替换上述示例中的

waitfor 语句:

waitfor delay "0:00:10"

发出 waitfor 命令后,在达到指定的时间或发生指定的事件前,不能使用 与 Adaptive Server 的连接。


注释

使用注释符号使注释附加到语句、批处理和存储过程。注释不会被执行, 而且没有最大长度的限制。

可以单独一行或在命令行结束处插入注释。可以使用两种注释样式: “斜线 — 星号”样式:

/* text of comment */

和 “双连字符”样式:

-- text of comment


斜线 - 星号样式注释


/* 样式注释是 Transact-SQL 扩展。只要每条注释以 “/*”开始并以 “*/” 结束,多行注释就是可接受的。“/*”和 “*/”之间的所有内容都作为 注释的一部分来处理。 /* 形式允许嵌套。

多行注释惯用的样式是第一行以 “/*”开始,后续各行以 “**”开始。 这种注释通常以 “*/”结束:

select * from titles

/* A comment here might explain the rules

** associated with using an asterisk as

** shorthand in the select list.*/ where price > $5

以下过程包括几个注释:

/* this procedure finds rules by user name*/ create procedure findmyrule @nm varchar(30) = null as

if @nm is null begin

print "You must give a user name" return

print "I have returned"

/* this statement follows return,

** so won’t be executed */ end

else /* print the rule names and IDs, and the user ID */

select sysobjects.name, sysobjects.id, sysobjects.uid

from sysobjects, master..syslogins where master..syslogins.name = @nm

and sysobjects.uid = master..syslogins.suid and sysobjects.type = "R"


双连字符样式注释


此注释样式以两个连续的连字符和随后的一个空格 (-- ) 开始并以换行符 终止。因此,不能使用多行注释。

Adaptive Server 不会将字符串文字中或 /* 样式注释中的两个连续连字符 解释为注释开始的标记。

要表示包含两个连续减号的表达式 (binary 后接 unary, 则在两个连字 符之间放置一个空格或一个开始小括号。

示例如下:

-- this procedure finds rules by user name

create procedure findmyrule @nm varchar(30) = null as

if @nm is null begin

print "You must give a user name" return

print "I have returned"

-- each line of a multiple-line comment

-- must be marked separately. end

else -- print the rule names and IDs, and

-- the user ID

select sysobjects.name, sysobjects.id, sysobjects.uid

from sysobjects, master..syslogins where master..syslogins.name = @nm

and sysobjects.uid = master..syslogins.suid and sysobjects.type = "R"




--------------------------------------华丽的分割线-------------------------------------------------------------------------

Sybase SQL Anywhere数据库恢复工具ReadASADB:

之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具: ReadASADB。
此工具支持ASA v5.0, v6.0, v7.0, v8.0, v9.0, v10.0, v11.0, v12.0, v16.0, v17.0等版本。
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具。
恢复Sybase SQL Anywhere的工具在国内处于领先水平。

Sybase SQL Anywhere数据库恢复工具ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具
  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x,17.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集,包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

Sybase SQL Anywhere数据库恢复工具ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

Sybase SQL Anywhere数据库恢复工具ReadASADB的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page
7、*** ERROR *** Assertion failed: 201417 (7.0.4.3541) Invalid count or free space offset detected on a table page
8、Internal database error *** ERROR *** Assertion failed: 201425 (8.0.3.5594) Invalid count or free space offset detected on a free list page -- transaction rolled back.
9、Internal database error *** ERROR *** Assertion failed: 100702 (8.0.1.2600) Unable to modify indexes for a row referenced in rollback log -- transaction rolled back


-------------------------------------------------------------------------------------------

Sybase ASE数据库恢复工具READSYBDEVICE:

一个不依赖数据库管理系统、直接从Sybase数据库设备文件上提取数据的业内领先的恢复工具!
能够从损坏的Sybase ASE设备文件(.dat)上提取数据的非常规恢复工具。

Sybase ASE数据库恢复工具READSYBDEVICE的主要功能:

  1. 被勒索病毒加密数据文件及备份文件情况下的恢复;
  2. 系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
  3. 因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
  4. delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复 等;
  5. 各种Sybase内部系统表损坏、索引错误的修复;
  6. master数据库损坏而无法正常运行情况下的恢复;
  7. Sybase数据库被标记为可疑,不可用等情况的恢复;
  8. Sybase数据库中数据文件内部出现坏块情况下的恢复;
  9. Sybase数据库无数据文件但有日志文件的情况下的恢复;
  10. Sybase数据库只有数据文件无任何日志文件的情况下的恢复;
  11. Sybase数据文件被误删除情况下的碎片提取恢复;
  12. 磁盘阵列上的Sybase数据库被误格式化情况下的数据库恢复;
  13. 数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
  14. Sybase数据库还原数据库出现失败情况下的恢复;
  15. Sybase数据库只剩下损坏的备份文件情况下的恢复。

Sybase ASE数据库恢复工具READSYBDEVICE支持的版本:

Sybase ASE 11.0.x,11.5.x,11.9.x,12.0.x,12.5.x,15.0.x,15.5.x,15.7.x,16.0.x


-------------------------------------------------------------------------------------------

SQL Server数据库恢复工具SQLRescue:

一个不依赖数据库管理系统、直接从SQL Server数据库文件上提取数据的业内领先的恢复工具!
能够从损坏的SQL Server数据库文件(.mdf)上提取数据的非常规恢复工具。

SQL Server数据库恢复工具SQLRescue的主要功能:

  1. 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;
  2. 断电导致数据库文件损坏情况下的恢复;
  3. 硬盘坏道造成数据库损坏情况下的恢复;
  4. 数据文件内部存在坏页情况下的恢复;
  5. 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;
  6. 并闩锁错误、格式化、误删除后导致软件不能使用的情况;
  7. 无法读取并闩锁页sysindexes失败情况下的修复;
  8. 数据文件被误删除情况下的碎片提取恢复;
  9. 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;
  10. master数据库损坏而无法正常运行情况下的恢复;
  11. 数据文件无法附加情况下的数据恢复;
  12. 数据库被标记为可疑,质疑,不可用等情况的恢复;
  13. 数据库sysobjects等系统表损坏情况下的恢复;
  14. 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;
  15. 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;
  16. 数据库被误格式化等情况下的数据库恢复;
  17. 日志收缩造成数据库损坏情况下的恢复;
  18. 仅剩损坏的备份文件情况下的恢复。

SQL Server数据库恢复工具SQLRescue技术特点:

只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。
  1. 从数据文件中直接恢复数据
  2. 不能附加时直接恢复数据并生成新的数据库
  3. 系统表损坏的数据库修复
  4. 快速修复SQL 823错误、连接中断错误

SQL Server数据库恢复工具SQLRescue支持的版本:

Microsoft SQL Server 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017,2019。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------