随着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数据库技术问题需要咨询,请联系我!
以下官方手册为ASE 15.7 ESD#2中文版:
- 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
- 新增功能摘要
- 新增功能指南
- ASE 15.7 发行公告
- 配置指南(windows)
- 安装指南(windows)
- 参考手册:构件块
- 参考手册:命令
- 参考手册:过程
- 参考手册:表
- Transact-SQL® 用户指南
- 系统管理指南,卷 1
- 系统管理指南,卷 2
- 性能和调优系列:基础知识
- 性能和调优系列:锁定和并发控制
- 性能和调优系列:监控表
- 性能和调优系列:物理数据库调优
- 性能和调优系列:查询处理和抽象计划
- 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
- 性能和调优系列:利用统计分析改进性能
- 程序员参考 jConnect for JDBC 7.0.7
- Adaptive Server Enterprise 中的 Java
- 组件集成服务用户指南
- Ribo 用户指南
- 内存数据库用户指南
- Sybase Control Center for Adaptive Server® Enterprise
- 安全性管理指南
- 实用程序指南
select
说明 从数据库对象中检索行。
语法 select ::=
select [all | distinct] [top unsigned_integer] select_list [into_clause] [from_clause] [where_clause] [group_by_clause]
[having_clause] [order_by_clause] [compute_clause] [read_only_clause] [isolation_clause] [browse_clause] [plan_clause] [for_xml_clause]
select_list ::=
注释 注意:有关 select_list的详细信息,请参见 “参数”部分。
into_clause ::=
into [[database.] owner.] table_name
[(colname encrypt [with [database.[owner].]keyname] [,
colname encrypt_clause ...])]
| [compressed = compression_level | not compressed] [in row [(length)] | off row ]
[{[external table at] 'server_name.[database].[owner].object_name ’
| external directory at 'pathname'
| external file at 'pathname' [column delimiter 'string']}] [on segment_name]
dml_logging = (full | minimal) [partition_clause]
[lock {datarows | datapages | allpages}] [with [, into_option[, into_option] ...]]]
| into existing table table_name partition_clause::=
partition by range (column_name[, column_name]...) ([partition_name] values <= ({constant | MAX}
[, {constant | MAX}] ...)[on segment_name] [compression_clause] [on segment_name]
[, [partition_name] values <= ({constant | MAX}
[, {constant | MAX}] ...)[on segment_name]]...)
[compression_clause] [on segment_name]
| partition by hash (column_name[, column_name]...)
{ (partition_name [on segment_name] [compression_clause] [on segment_name]
[, partition_name [on segment_name]]...) [compression_clause] [on segment_name]
| number_of_partitions
[on (segment_name[, segment_name] ...)]}
| partition by list (column_name)
([partition_name] values (constant[, constant] ...) [compression_clause] [on segment_name]
[, [partition_name] values (constant[, constant] ...) [compression_clause] [on segment_name]
| partition by roundrobin
{ (partition_name [on segment_name]
[, partition_name [on segment_name]]...) [compression_clause] [on segment_name]
| number_of_partitions
[on (segment_name [, segment_name]...)]}
into_option ::=
| max_rows_per_page = num_rows
| exp_row_size = num_bytes
| reservepagegap = num_pages
| identity_gap = gap
| compression = {none | page | row}
| lob_compression = off | compression_level]
from_clause ::=
from table_reference [,table_reference]...
table_reference ::=
table_view_name | ANSI_join
table_view_name ::= [[database.]owner.]{{table_name | view_name} [as] [correlation_name]
[(index {index_name | table_name})] [parallel [degree_of_parallelism]] [prefetch size][lru | mru]}
[holdlock | noholdlock] [readpast]
[shared]
ANSI_join ::=
table_reference join_type join table_reference join_conditions
join_type ::= inner | left [outer] | right [outer]
join_conditions ::= on search_conditions
compression_clause::=
with compression = {none | page | row}
where_clause ::=
where search_conditions
for update [of column_list
group_by_clause ::=
group by [all] aggregate_free_expression
[, aggregate_free_expression]...
having_clause ::=
having search_conditions
order_by_clause ::=
order by sort_clause [, sort_clause]...
sort_clause ::=
{[[[database.]owner.]{table_name.|view_name.}]column_name
| select_list_number
| expression } [asc | desc]
compute_clause ::=
compute row_aggregate (column_name) [, row_aggregate (column_name)]...
[by column_name [, column_name]...]
read_only_clause ::=
for {read only | update [of column_name_list]}
isolation_clause ::=
at isolation
{read uncommitted | 0}
| {read committed | 1}
| {repeatable read | 2}
| {serializable | 3}
browse_clause ::=
for browse
plan_clause ::=
plan "abstract plan"
注释 有关 select...for_xml_clause 的语法、示例和用法的信息,请参见
《XML 服务》一书。
参数 all
在结果中包括所有行, all 是缺省值。
只在结果中包括唯一行。 distinct 必须是选择列表的第一个词。在浏览 模式下将忽略 distinct。
由于关键字 distinct 的关系,NULL 值被认为是相等的:无论遇到多少
NULL ,只选择一个。
top unsigned_integer
与 select...into 语句一起使用,可以限制插入到目标表中的行数。这与
set rowcount 不同,在执行 select...into 时,set rowcount 命令会被忽略。
• 当与 delete、 update 一起使用或用在视图中时,不能指定顺序。 如果表上有聚簇索引形成的隐含顺序,则会应用该顺序;否则, 结果可能以任何顺序排列,排列顺序不可预料。
• n 为 0 到 232-1 (4GB-1 或 4,294,967,295)之间的无符号 32 位值。 零表示没有行。
• 与游标一起使用时, top n 会限制结果集的总体大小。指定 set cursor rowcount 则会限制单次读取的结果。
• 如果视图定义包含 select top n,而带有 where clause 子句的查询也 使用该命令,则二者的结果可能不一致。
select_list
包含一个或多个下列项目:
• “*”,表示按 create table 顺序排列的所有列。
• 按您希望的查看顺序排列的列名称列表。当选择现有的 IDENTITY 列时,可使用由表名限定的 syb_identity 关键字在必要 的地方替代实际的列名。
• 向结果表中添加新 IDENTITY 列的规范:
column_name = identity (int | smallint | tinyint | precision)
如果您指定 int、 smallint 或 tinyint,则结果列为整数。如果您指定 precision,则结果为数值数据类型。
• 缺省列标题 (列名)的替代内容,形式如下:
column_heading = column_name column_name column_heading
column_name as column_heading
在所有这些格式中,都可以将列标题用引号引起来。如果标题不 是有效的标识符 (即标题是保留字、标题以特殊字符开始或者标 题包含空格或标点符号),就必须用引号引起来。
• 表达式 (列名、常量、函数、任何由算术运算符或逐位运算符连 接起来的列名、常量和函数的组合,也可以是子查询)。
• 内置函数或集合。
• 上面所列项目的任意组合。
select_list 也可以给变量赋值,形式如下:
@variable = expression
[, @ variable = expression ...]
不能将变量赋值与任何其它 select_list 选项组合。
into
除非与 existing table 一起使用,否则将根据在选择列表中指定的列以 及在 where 子句中选择的行来创建新表。请参见 第 580 页的 “使用 select into ”。
colname encrypt
在目标表中,指定对 colname 进行加密。缺省情况下, Adaptive Server 会对从源表中选择的数据进行解密。必须使用 encrypt 关键字才 能保留数据加密或者在目标数据库中对源数据库中未加密的列进行加 密。
compression = compression_level | not compressed
指示行中的大对象 (LOB) 数据是否压缩以及压缩级别。
compression_level | not compressed
指示行的压缩级别:
• 0 – 不压缩行。
• 1 到 9 - Adaptive Server 使用 ZLib 压缩。通常,压缩级别数字越 大, Adaptive Server 压缩 LOB 数据的程度就更大,压缩和非压缩 数据之间的比率就越大 (也就是说,压缩数据与非压缩数据大小 相比,节省的空间量就越大 (以字节为单位))。
但是,压缩量取决于 LOB 内容,压缩级别越高,进程占用 CPU 越 大。也就是说,级别 9 的压缩率最高,但其 CPU 占用率也最高。
• 100 - Adaptive Server 使用 FastLZ 压缩。这是使用最低 CPU 使用 率的压缩率;通常用于较小量数据。
• 101 - Adaptive Server 使用 FastLZ 压缩。与值为 100 时相比,值为
101 时的 CPU 占用率略高,但压缩率也略高。
压缩算法忽略不使用 LOB 数据的行。
column_list
是一个由逗号分隔的列列表。
with database...key
指定用于源数据的密钥或指定其它密钥。
in row [(length)]
设置或更改目标表中的 LOB 列的行内特性。如果您不指定 length,
Adaptive Server 会使用所配置的缺省行内长度。
缺省情况下,目标表中的 LOB 列继承 select 列表中的相应 LOB 列的 存储属性。如果表达式 (如 convert(text, column ) 内置函数)生成目标 表的 LOB 列,则该列会自动使用行外存储,除非您通过指定 in row [( length )] 更改设置。
off row
将列的存储格式从行内更改为行外。
external [[table] | directory | file] 表示外部对象的类型是表、目录或文件。如果您未指明文件、目录或 表,则 select into 假定您使用的是表。
注释 在使用 partition_clause 的任何部分时,不能指定外部位置。只能 在当前服务器和数据库中的表上创建分区。
'server_name.[database].[owner].object_name' 表示您将所选择的数据添加到远程 server_name 上所找到的表或视图 中。
dml_logging
确定 insert、update 和 delete 操作以及某些形式的批量插入的日志记录 量。以下值之一:
• full – Adaptive Server 记录所有事务
• minimal - Adaptive Sever 不记录行或页更改
at ' path_name ' 表示特定于操作系统的完整路径名称,该路径包含您将所选择的数据 添加到的外部文件或目录。 Adaptive Server 必须能访问 path_name 中 的所有目录。
column delimeter ' string ' 表示将列的数据转换为字符串格式后,用来分隔列的分隔符。 string 最多可以有 16 个字符。如果没有指定分隔符, select into 使用制表 符。
existing table table_name 表示您正在选择数据到代理表中。除代理表外,不能对任何其它表类 型使用 select into。 select 列表中的列列表必须与代理表中的列列表在 类型、长度和数量上匹配。
on segment_name
指定要在已命名段上创建表。在使用 on segment_name 选项之前,必 须使用 disk init 初始化设备,并使用 sp_addsegment 将段添加到数据 库。要获得数据库中可用段名的列表,请咨询系统管理员或使用 sp_helpsegment。
partition by range 指定要根据一个或多个分区列中的值对记录分区。将每个分区列值与 用户提供的几组上下限相比较,以确定分区分配。
column_name
在 partition_clause 中使用时,指定一个分区键列。
partition_name 指定要在其上存储表记录的新分区的名称。分区名称在表或索引上的 分区组内必须唯一。如果使用 set quoted_identifier on,则分区名称可 以是分隔标识符。否则,分区名称必须是有效的标识符。
如果省略 partition_name,则 Adaptive Server 将创建一个格式为 table_name _ partition_id 的名称。 Adaptive Server 将截断超过允许的最 大长度的分区名称。
values <= constant | MAX
指定命名分区的上限值 (包括边界值)。为最高分区上限指定常量值 将在表上施加隐式完整性约束。关键字 MAX 指定给定数据类型的最 大值。
on segment_name
在 partition_clause 中使用时,指定将在其上放置分区的段的名称。使 用 on segment_name 时,必须已经用 create databa se 或 alter databa se 将 逻辑设备指派给了数据库,且必须已经用 sp_addsegment 在数据库中 创建了段。要获得数据库中可用段名的列表,请咨询系统管理员或使 用 sp_helpsegment。
partition by hash 指定要按系统提供的散列函数对记录分区。该函数计算分区键的散列 值,这些分区键指定将记录分配到的分区。
partition by list 指定要按命名列中指定的实际值对记录分区。分区键只包含一个列。 最多可以列出 250 个常量作为每个列表分区的分区值。
partition by roundrobin 指定要按顺序方式对记录分区。循环分区表没有分区键。用户和优化 程序都不知道特定记录位于哪个分区中。
lock datarows | datapages | allpages
指定要用于由 select into 命令创建的表的锁定方案。缺省值是对配置 参数 lock scheme 的全服务器范围的设置。
max_rows_per_page
限制由 select into 创建的表的数据页的行数。与 fillfactor 不同, max_rows_per_page 值在插入和删除数据时保持不变。仅数据锁定表 不支持 max_rows_per_page。
exp_row_size = num_bytes
指定由 select into 命令创建的表的期望行宽。只对数据行、数据页锁 定方案和具有可变长度行的表有效。有效值可以是 0、 1 以及介于表 的最小和最大行长度之间的任何值。缺省值为 0,表示使用服务器范 围的缺省值。
reservepagegap = num_pages 指定填充页与空白页的比率,要保留该比率的空白页作为 select into 分配扩充来存储数据。此选项只对 select into 命令有效。对于每个指 定的 num_pages,都会预留一个空白页供表将来扩展之用。有效值为 0 到 255。缺省值为 0。
readpast
指定查询自动跳过带排它锁的行,不必等待也不生成消息。
identity_gap
指定表的标识间隔。该值只替换此表的系统标识间隔设置。
compression = 表示要用于表或分区的压缩级别。新的压缩级别应用到新插入或更新 的数据:
• none – 不压缩该表或分区中的数据。对于分区, none 表示始终 不压缩该分区中的数据,即使将表压缩修改为 row 或 page 压缩也 是如此。
• row - 压缩单个行中的一个或多个数据项。只有在压缩形式比非压 缩形式更节省空间时, Adaptive Server 才会用 row 压缩形式存储 数据。在分区级或表级设置 row 压缩。
• page - 当页面已满时,则会使用页级压缩来压缩现有的采用行压 缩形式的数据行,从而创建页级字典、索引和字符编码条目。在 分区级或表级设置 page 压缩。
Adaptive Server 只有在已经在行级压缩数据后才会在页级压缩数 据,因此,将压缩设置为 page 意味着 page 和 row 压缩。
lob_compression = compression_level
决定表的压缩级别。
value
是标识间隔量。
如果用 select into 语句从具有特定标识间隔设置的表创建表,则新表 不继承父表的标识间隔设置。相反,新表使用 identity burning set factor 设置。若要为新表指定一个特定的 identity_gap 设置,则应在 select into 语句中指定标识间隔。可以为新表指定一个与父表相同或不 同的标识间隔。
from
表示 select 语句中要使用哪些表和视图。 from 是必需的,除非 select
列表不包含列名 (即只包含常量和算术表达式):
select 5 x, 2 y, "the product is", 5*2 Result x y Result
------- ------- ------------------ -----------
5 2 the product is 10
一个查询最多可以引用 50 个表和 14 个工作表 (如由集合函数创建的
那些表)。 50 个表的限制包括:
• from 子句中列出的表 (或表上的视图)。
• 对同一个表的多个引用的每个实例 (自连接)
• 在子查询中引用的表
• 用 into 创建的表
• from 子句中列出的视图所引用的基表
view_name, table_name
列出 select 语句中使用的表和视图。如果该表或视图位于另一数据库 中,请指定该数据库名称;如果在数据库中有多个具有该名称的表或 视图,请指定所有者的名称。 owner 的缺省值是当前用户,而 database 的缺省值是当前数据库。
如果列表中有多个表或视图,用逗号分隔它们的名称。表和视图在关 键字 from 后的顺序不影响结果。
为清晰起见,或为区分表和视图在自连接或子查询中充当的不同角 色,可给出表名和视图名的相关名 (别名)。若要指派相关名,首先 给出表或视图的名称,接着一个空格,然后是相关名,如下所示:
select pub_name, title_id
from publishers pu, titles t where t.pub_id = pu.pub_id
对该表或视图的所有其它引用 (例如在 where 子句中)必须使用该相 关名。相关名不能以数字开头。
index index_name
指定访问 table_name 要使用的索引。从视图中选择时不能使用此选 项,但可将它用作 create view 语句中 select 子句的一部分。
parallel
如果 Adaptive Server 配置为允许并行处理,则指定并行分区或索引扫 描。
degree_of_parallelism 指定将以并行方式扫描表或索引的工作进程数。如果设置为 1,查询 将以串行方式执行。
prefetch size
为绑定到配置了大 I/O 的高速缓存的表指定 I/O 大小 (单位为千字 节)。当从视图中选择时,不能使用这一选项,但可以作为 create view 语句的 select 子句的一部分使用。 sp_helpcache 显示对象绑定到 的高速缓存或缺省高速缓存的有效大小。若要配置数据高速缓存大 小,请使用 sp_cacheconfigure。
在使用 prefetch 并指定预取大小 ( size ) 时,最小值是 2K 或逻辑页大小 与 2 的任意次方的乘积 (最大为 16K)。 prefetch 大小选项如下 (单 位为千字节):
逻辑页大小 |
预取大小选项 |
2 |
2, 4, 8 16 |
4 |
4, 8, 16, 32 |
8 |
8, 16, 32, 64 |
16 |
16, 32, 64, 128 |
在查询中指定的 prefetch 大小仅仅是一个建议。要使用指定的大小, 应将数据高速缓存按该大小进行配置。如果未将数据高速缓存配置为 特定的大小,则使用缺省的 prefetch 大小。
如果启用了 CIS,则不能对远程服务器使用 prefetch。 lru | mru
指定对表使用的缓冲区替换策略。使用 lru 强制优化程序将表读入
MRU/LRU (最近使用最多的/最近使用最少的)链上的高速缓存。使 用 mru 可放弃高速缓存中的缓冲区并将其替换为该表的下一个缓冲 区。从视图中选择时不能使用此选项,但可将它用作 create view 语句 中 select 子句的一部分。
holdlock
通过持有共享锁直到事务完成 (而不是无论事务是否完成,一旦请 求的数据页不再需要,就释放共享锁)来加强对指定表或视图的共享 锁的限制。
holdlock 选项仅适用于指定了该选项的表或视图,且仅在使用该选项 的语句所定义的事务的持续期间适用。设置 set 命令的 transaction isolation level 3 选项隐式地为事务中的每个 select 语句应用 holdlock。在 包括 for browse 选项的 select 语句中,不允许使用关键字 holdlock。在 查询中不能同时指定 holdlock 和 noholdlock 选项。
如果启用了 CIS,则不能对远程服务器使用 holdlock。 noholdlock
禁止服务器持有执行此 select 语句期间获得的任何锁,无论当前处于何
种事务隔离级别。在查询中不能同时指定 holdlock 和 noholdlock 选项。
指示 Adaptive Server 在指定的表或视图上使用共享锁 (而非更新 锁)。这允许其它客户端获得表或视图的更新锁。 shared 关键字只能 与 declare cursor 语句中包含的 select 子句一起使用。例如:
declare shared_crsr cursor for select title, title_id from titles shared
where title_id like "BU%"
在每一表或视图名称后,可联合 shared 使用关键字 holdlock。但 holdlock 必须在 shared 之前。
ANSI join
使用 ANSI 语法的内部或外部连接。 from 子句指定要连接的表。
inner
只包含满足 on 子句条件的内部和外部表的行。对于不满足 on 子句条 件的外部表中的行,包含内部连接的查询所得到的结果集中不包含任 何空值行。
outer
包含外部表的所有行,无论是否满足 on 子句条件。如果某行不满足 on 子句条件,则内部表的值将作为空值存储在连接表中。 ANSI 外连 接中的 where 子句将限制查询结果中的行。
left
左连接将保留在连接子句左侧列出的表引用的所有行。左表引用称为 外部表或行保留表。
在下面的查询中, T1 是外部表, T2 是内部表:
T1 left join T2 T2 right join T1
right
右连接将保留在连接子句右侧列出的表引用的所有行 (请参见上例)。
search_conditions 用于为检索的行设置条件。搜索条件可以包括列名、表达式、算术运 算符、比较运算符、关键字 not、like、is null、and、or、between、in、 exists、 any 和 all 、子查询、条件表达式或这些项目的任意组合。有关 详细信息,请参见 第 697 页的 “ where 子句”。
查找每个组的值。这些值在结果中作为新列、而不是新行出现。
当 group by 与标准 SQL 一起使用时,选择列表中的每一项必须在组中 的每一行有固定值或与集合函数 (为每个组生成一个值)一起使用。 Transact-SQL 对选择列表中的项目没有这种限制。此外,
Transact-SQL 还允许按任何表达式 (列别名除外)分组;对于标准
SQL,则只能按列来分组。
可以将 表 1-28 中列出的集合 (expression 几乎总是一个列名)与
group by 一起使用:
表 1-28: 将集合与 group by 一起使用的结果
集合函数 结果
sum([all | distinct] expression) 数值列中的值的总和。
avg([all | distinct] expression) 数值列中的值的平均值。
count([all | distinct] expression) 以 integer 形式返回的列中 (不同)非空值的数量。 count_big ([all | distinct] expression) 以 bigint 形式返回的列中不同非空值的数量。 count(*) 以 integer 形式返回的选定行数。
count_big(*) 以 bigint 形式返回的选定行数。
max (expression) 列中的最大值。
min (expression) 列中的最小值。
有关详细信息,请参见 第 434 页的 “ group by 和 having 子句”。
可以按任何列组合来对表分组 – 即组可以互相嵌套。不能按列标题分 组;必须使用列名、表达式或代表项目在选择列表中的位置的编号。
group by all 在结果中包括所有组,即使是那些没有任何行满足搜索条件的组也包 括在内。有关示例,请参见 第 434 页的 “ group by 和 having 子句 ”。
aggregate_free_expression
是不包含集合的表达式。
设置 group by 子句的条件,方式与用 where 为 select 子句设置条件的 方式相似。可以包含的条件的数目没有限制。
可以使用不带 group by 子句的 having 子句。 如果选择列表中的任何列没有应用集合函数且不包括在查询的 group by
子句中 (在标准 SQL 中为非法),则 having 和 where 的意义稍有不同。
在这种情况下, where 子句限制集合计算中包括的行,但不限制查询 返回的行。相反, having 子句限制查询返回的行,但不影响集合的计 算。有关示例,请参见 第 434 页的 “ group by 和 having 子句”。
order by
按列对结果进行排序。在 Transact-SQL 中,可以对选择列表中没有的 项目使用 order by。可以按列名、列标题 (或别名)、表达式或代表 项目在选择列表中位置的编号 ( select_list_number ) 来排序。如果按选 择列表编号排序,则 order by 子句引用的列必须包括在选择列表中, 且选择列表不能是 * (星号)。
使用带 order by 的 select max 可以在结果集中返回多行。
asc
desc
compute
与行集合 ( sum、 avg、 min、 max、 count 和 count_big)一起使用以生 成控制中断摘要值。摘要值在查询结果中作为附加行出现,从而允许 用一个语句查看明细行和摘要行。
select into 子句不能与 compute 一起使用。
如果使用 compute by,也必须同时使用 order by 子句。在 compute by 后 面列出的列必须与 order by 后面列出的列相同或是其子集,它们从左 向右的顺序必须一致,以同一表达式开始且不跳过任何表达式。
例如,如果 order by 子句为 order by a, b, c,则 compute by 子句可 以是以下任意 (或所有)形式:
compute by a, b, c compute by a, b
compute by a
不带 by 的 compute 关键字可用于生成总和、总计数等。如果使用不带 by 的 compute,order by 就是可选的。有关详细信息和示例,请参见 第 88 页的 “ compute clau se”。
如果启用了 CIS, compute 不会被转发给远程服务器。
for {read only | update}
指定游标结果集是只读的或可更新的。
对于低于 15.7 的 Adaptive Server 版本,只能在存储过程中使用此选 项,而且只有在过程定义游标查询时才可以。在这种情况下, select 是唯一被允许在过程中使用的语句。它定义 for read only 或 for update 选项 (代替 declare cursor 语句)。这种声明游标的方法提供了在读取 行时进行页级锁定这一好处。
另外,对于低于 15.7 的 Adaptive Server 版本,如果存储过程中的 select 语句不用于定义游标, Adaptive Server 会忽略 for read only | update 选项。有关使用存储过程声明游标的详细信息,请参见嵌入式 SQL™ 文档。
对于 Adaptive Server 15.7 和更高版本,如果设置了 select for update,您 就可以在存储过程之外在语言级使用 for update 选项,但必须在事务之 内。这种 select 不需要引用游标。当您在数据行锁定表中使用 select for update 时,选定的行会在事务持续时间内被以排它方式锁定。
有关只读或可更新游标的信息,请参见 《Transact-SQL 用户指南》。
of column_name_list
是来自被定义为可更新的游标结果集 (用 for update 选项定义)的列 的列表。
at isolation
指定查询的隔离级别 (0、 1、 2 或 3)。如果忽略该子句,查询将使 用执行它的会话的隔离级别 (缺省隔离级别为 1)。at isolation 子句仅 对单个查询或在 declare cursor 语句内有效。如果使用 at isolation,则 Adaptive Server 返回语法错误:
• 用于使用 into 子句的查询
• 在子查询内
• 用于 create view 语句中的查询
• 用于 insert 语句中的查询
• 使用 for browse 子句的查询
如果查询中有 union 运算符,则必须在最后一个 select 后指定 at isolation 子句。如果在指定了 at isolation read uncommitted 的查询中同时指定 holdlock、noholdlock 或 shared,则 Adaptive Server 会发出警告并忽略 at isolation 子句。对于其它隔离级别, holdlock 优先于 at isolation 子句。有 关隔离级别的详细信息,请参见 《Transact-SQL 用户指南》。
如果启用了 CIS,则不能对远程服务器使用 at isolation。 read uncommitted | 0
将查询的隔离级别指定为 0。
read committed | 1
将查询的隔离级别指定为 1。
repeatable read | 2
将查询的事务隔离级别指定为 2。
serializable | 3
将查询的隔离级别指定为 3。
for browse
必须附加到在 DB-Library 浏览应用程序中被发送到 Adaptive Server 的 SQL 语句的结尾。有关详细信息,请参见 Open Client DB-Library Reference Manual (《Open Client DB-Library 参考手册》)。
plan "abstract plan" 指定用来优化查询的抽象计划。它可以是用抽象计划语言指定的完整 或部分计划。有关详细信息,请参见 《性能和调优指南》中的 “创 建和使用抽象计划”。
示例 示例 1 从 publishers 表中选择所有行和列:
select * from publishers
pub_id pub_name city state
------ --------------------------- -------------------- -----
0736 New Age Books Boston MA 0877 Binnet & Hardley Washington DC 1389 Algodata Infosystems Berkeley CA
示例 2 从 publishers 表的特定列中选择所有行:
select pub_id, pub_name, city, state from publishers
示例 3 从 publishers 表的特定列中选择所有行,替换一个列名并向输出中 添加字符串:
select "The publisher's name is", Publisher = pub_name, pub_id from publishers
Publisher pub_id
----------------------- ----------------------------- ------
The publisher’ s name is New Age Books 0736
The publisher’ s name is Binnet & Hardley 0877
The publisher’ s name is Algodata Infosystems 1389
示例 4 从 titles 表的特定列中选择所有行,并替换列名:
select type as Type, price as Price from titles
示例 5 为 select into 指定锁定方案和保留页间距:
select title_id, title, price into bus_titles
lock datarows with reservepagegap = 10 from titles
where type = "business"
示例 6 选择数据添加到 bigspenders 表时对 creditcard 列进行加密:
select creditcard, custid, sum(amount) into #bigspenders (creditcard
encrypt with cust.database.new_cc_key) from daily_xacts group by creditcard having sum(amount) > $5000
示例 7 只选择未以排它方式锁定的行。如果任何其他用户在某一限定行 上有排它锁,则不返回该行:
select title, price from titles readpast
where type = "news"
and price between $20 and $30
示例 8 选择特定列和行,将结果放入临时表 # advance_rpt 中:
select pub_id, total = sum (total_sales) into #advance_rpt
from titles
where advance < $10000
and total_sales is not null group by pub_id
having count(*) > 1
示例 9 从 authors 表中选择 au_lname 的前 3 行:
select top 3 au_lname from authors
示例 10 并置两列并将结果放入临时表 # tempnames 中:
select "Author_name" = au_fname + " " + au_lname into #tempnames
from authors
示例 11 选择特定列和行,返回按类型由高到低排序的结果,并计算摘要 信息:
select type, price, advance from titles order by type desc
compute avg (price), sum (advance) by type compute sum(price), sum(advance)
示例 12 选择特定列和行,并计算 price 和 advance 列的总和:
select type, price, advance from titles compute sum (price), sum (advance)
示例 13 创建 coffeetabletitles 表,该表是 titles 表的副本,其中只包括价格 高于 $20 的书:
select * into coffeetabletitles from titles where price > $20
示例 14 创建 newtitles 表,该表是 titles 表的空副本:
select * into newtitles from titles where 1 = 0
示例 15 给出优化提示:
select title_id, title
from titles (index title_id_ind prefetch 16) where title_id like "BU%"
示例 16 使用 syb_identity 关键字从 sales_east 和 sales_west 表中选择
IDENTITY 列:
select sales_east.syb_identity,
sales_west.syb_identity from sales_east, sales_west
示例 17 创建 newtitles 表,该表是具有 IDENTITY 列的 titles 表的副本:
select *, row_id = identity (10) into newtitles from titles
示例 18 指定查询的事务隔离级别。
select pub_id, pub_name from publishers
at isolation read uncommitted
示例 19 使用 repeatable read 隔离级别从 titles 中选择。在事务完成之前, 其他用户将不能更改受影响行中的值或删除受影响的行:
begin tran
select type, avg(price) from titles
group by type
at isolation repeatable read
示例 20 给出查询并行度的优化提示:
select ord_num from salesdetail (index salesdetail parallel 3)
示例 21 在 title_id 列上连接 titleauthor 和 titles 表。结果集中仅包含 price 大 于 15 的行:
select au_id, titles.title_id, title, price from titleauthor inner join titles
on titleauthor.title_id = titles.title_id and price > 15
示例 22 结果集包括 authors 表中的所有作者。当作者与他们的出版者不 居住同一城市时, pub_name 列中的值就为空。只有 Cheryl Carson 和 Abraham Bennet 与他们的出版者位于同一城市,这两位作者在 pub_name 列中产生非空值:
select au_fname, au_lname, pub_name from authors left join publishers on authors.city = publishers.city
示例 23 从现有表 (newtable) 创建带标识间隔的新表 (oldtable),可在 select into 语句中指定:
select identity into newtable with identity_gap = 20
from oldtable
有关标识间隔的详细信息,请参见 《Transact-SQL 用户指南》的 “创 建数据库和表”中的 “管理表中的标识间隔”。
示例 24 创建一个具有行级压缩的表 bay_area_authors,并用有关居住在 旧金山海湾地区的作者的信息来填充该表:
select * into bay_area_authors with compression = row
from authors
where postalcode like '94%'
示例 25 创建一个名为 titles_2 的新表,该表压缩除 title 和 advance 外的所 有列:
select * into titles_2 (title not compressed, advance not compressed) with compression = page from titles
示例 26 设置 select for update 配置参数,执行 select for update,然后在同 一事务内执行 update:
sp_configure 'select for update', 1
Parameter Name Default Memory Used Config Value Run Value Unit Type
--------------------------- -------- ---------- ----------- ----------
------------------- --------------------
select for update 0 0 1 1
not applicable dynamic (1 row affected)
Resulting configuration value and memory use have not changed from previous values:new configuration value 1, previous value 1.
(return status = 0)
begin tran
select c_int, c_bigdatetime from basetbl1 where c_int > 90 for update of c_bigint
c_int c_bigdatetime
----------- -----------------------------
91 |
Sep |
14 |
2009 |
9:00:00.000000PM |
92 |
Sep |
15 |
2009 |
9:00:00.000000PM |
93 |
Sep |
16 |
2009 |
9:00:00.000000PM |
94 |
Sep |
17 |
2009 |
9:00:00.000000PM |
95 |
Sep |
18 |
2009 |
9:00:00.000000PM |
96 |
Sep |
19 |
2009 |
9:00:00.000000PM |
97 |
Sep |
20 |
2009 |
9:00:00.000000PM |
98 |
Sep |
21 |
2009 |
9:00:00.000000PM |
99 |
Sep |
22 |
2009 |
9:00:00.000000PM |
100 |
Sep |
23 |
2009 |
9:00:00.000000PM |
(10 |
rows affected) |
update basetbl1 set c_bigint = 5000 where c_int > 90 (10 rows affected)
commit tran go
示例 27 从现有表 sales_detail 创建一个新表 sales_report。新表按 qty 列的 范围分区。
select * into sales_report partition by range (qty) (smallorder values <= (500) on seg1,
bigorder values <= (5000) on seg2) from sales_detail
示例 28 使用此查询查找产生过多 IO 的语句作为调优候选项。
select lio_avg, qtext from sysquerymetrics order by lio_avg
示例 29 选择 titles 表添加到 pubs3 数据库:
select title_id, title, price into bus_titles
with dml_logging = minimal from titles
用法 • select 语句中的关键字 (与在所有其它语句中一样)必须按语法语 句中显示的顺序使用。
• select 语句中表达式的最大数量是 4096。
• 可在 select 后使用关键字 all 以与其它 SQL 实现兼容。all 是缺省值。 在此环境中使用时, all 与 distinct 正好相反。结果中包含检索到的所 有行,不管是否有重复。
• 除了在 create table、 create view 和 select into 语句中外,如果列标题 用引号引起来,则可以包含任何字符,包括空格和 Adaptive Server 关键字。如果列标题没有用引号引起,则它必须符合标识符规则。
• like 表示的字符串不能超过 255 字节。
• 对列数超过 255 的表不能使用 select...for browse 选项。
• create table、create view 和 select into 语句中的列标题以及表的别名都 必须遵循标识符的规则。
• 若要使用 select 将数据从某些字段为空值的表中插入不允许空值的 表中,必须为初始表中的所有 NULL 条目提供替代值。例如,为了 将数据插入不允许空值的 advances 表中,以下示例用 “0”替代 NULL 字段:
insert advances
select pub_id, isnull (advance, 0) from titles
如果不使用 isnull 函数,此命令会将带有非空值的所有行插入 advances 表,并对在 titles 表的 advance 列中包含 NULL 的所有行生 成错误消息。
如果无法对数据进行这种替代,则不能将包含空值的数据插入具有
NOT NULL 规定的列。
两个表可以在结构上相同,但在某些字段是否允许有空值这一点上 是不同的。使用 sp_help 可查看表中的列的空类型。
• 使用 select 语句返回的 text、unitext 或 image 数据的缺省长度是 32K。 可使用 set textsize 更改此值。当前会话的大小存储在全局变量
@@ textsize 中。在登录到 Adaptive Server 时,某些客户端软件可能 发出 set textsize 命令。
• 远程 Adaptive Server 中的数据可通过使用远程过程调用来检索。有 关详细信息,请参见 create procedure 和 execute。
• 游标定义中使用的 select 语句 (通过 declare cursor)必须包含 from 子句,但不能包含 compute、for browse 或 into 子句。如果 select 语句 包含以下任何结构,则游标被视为是只读且不可更新的:
• distinct 选项
• group by 子句
• 集合函数
• union 运算符
如果使用包含 order by 子句的 select 语句在存储过程中声明游标,则 该游标也被认为是只读的。即使它被认为是可更新的,也不能用包 含两个或多个表的连接的 select 语句定义的游标删除行。有关详细 信息,请参见 declare cursor。
• 如果为变量赋值的 select 语句返回多个行,则最后返回的值被赋给 此变量。例如:
declare @x varchar (40)
select @x = pub_name from publishers print @x
(3 rows affected)
Algodata Infosystems
使用 ANSI 连接语法
• 使用 ANSI 内部和外部连接语法编写查询之前,请阅读
《 Transact-SQL 用户指南》中的 “连接:从几个表中检索数据”中 的 “外部连接”。
• select into 是两步式操作。第一步创建新表,第二步将指定行插入新 表。
注释 可以对 CIS 现有表执行 select into。
因为用 select into 操作插入的行不被记录,所以不能在用户定义的事 务中发出 select into 命令,即使 ddl in tran 数据库选项设置为 true 亦如 此。select into 操作期间的页分配会被记录,因此大的 select into 操作 可能会填满事务日志。
如果 select into 语句在创建新表后失败, Adaptive Server 将不会自动 删除此表或释放此表的第一个数据页。这意味着,发生错误之前在 第一页插入的所有行都将保留在该页上。检查 select into 语句后的全 局变量 @@ error 的值,以确保没有发生错误。使用 drop table 语句删 除新表,然后重新发出 select into 语句。
• 新表的名称在数据库中必须是唯一的,并且必须符合标识符规则。 也可以 select into 临时表 (参见示例 7、 8 和 11)。
• 与基表相关联的任何规则、约束或缺省值不会转到新表中。可使用
sp_bindrule 和 sp_bindefault 把规则或缺省值绑定到新表。
• select into 不结转基表的 max_rows_per_page 值,并且使用值为 0 的 max_rows_per_page 创建新表。可使用 sp_chgattribute 设置 max_rows_per_page 的值。
• 为了 select into (插入)一个永久表, select into/bulkcopy/pllsort 选项 必须设置为 true (通过执行 sp_dboption)。无须为了 select into (插 入)一个临时表而将 select into/bulkcopy/pllsort 选项设置为 true,因为 从不恢复临时数据库。
在数据库中使用 select into 之后,必须先执行完全数据库转储才能使 用 dump transaction 命令。select into 操作只记录页的分配而不记录数据 行的更改。因此,不能从事务日志恢复更改。在这种情况下,发出 dump transaction 语句会产生错误消息,指示您改用 dump database。
缺省情况下,在新创建的数据库中, select into/bulkcopy/pllsort 选项设 置为 false。若要更改缺省情况,请在 model 数据库中将此选项设置 为 true。
• select into 可用于存档数据库。
• 当 dump database 进行时, select into 的运行速度更慢。
• 可以通过在 where 子句中使用 “假”条件来用 select into 创建没有数 据的复制表 (请参见示例 12)。
• 必须为选择列表中包含集合函数或任何表达式的列提供列标题。选 择列表中任何常数、算术或字符表达式、内置函数的使用或并置都 需要被影响的项目的列标题。列标题必须是有效的标识符或必须用 引号引起来 (请参见示例 7 和 8)。
• 当使用 select into 时,数据类型和可为空性被隐式地赋给实际值,例 如:
select x = getdate () into mytable
这产生一个不可为空的列,不论 allow nulls by default 打开还是关闭均 如此。它取决于如何使用 select 命令以及在语法中与其它哪些命令 一起使用。
convert 语法允许显式指定结果列的数据类型和可为空性,而不用缺 省值。
将 getdate 包含在确实得到空值的函数中,例如:
select x = nullif (getdate (), "1/1/1900") into mytable
或者,使用 convert 语法:
select x = convert (datetime null, getdate ()) into mytable
• 不能在用户定义的事务或具有 compute 子句的语句中使用 select into。
• 要选择一个 IDENTITY 列并添加到结果表中,应在 select 语句的 column_list 中包括该列名 (或 syb_identit y 关键字)。新列遵守下列 规则:
• 如果多次选择某一 IDENTITY 列,它将在新表中定义为 NOT NULL。该 IDENTITY 列将不继承 IDENTITY 属性。
• 如果选择 IDENTITY 列作为表达式的一部分,结果列不会继承 IDENTITY 属性。如果表达式中的任何列允许使用空值,则将 它创建为 NULL;否则,将它创建为 NOT NULL。
• 如果 select 语句包含 group by 子句或集合函数,结果列不会继承 IDENTITY 属性。包含 IDENTITY 列的集合的列将被创建为 NULL,其它列则为 NOT NULL。
• 通过联合或连接选入表中的 IDENTITY 列不保留 IDENTITY 属 性。如果表中包含 IDENTITY 列和 NULL 列的联合,新列将定 义为 NULL。否则,定义为 NOT NULL。
• 不能使用 select into 创建带有多个 IDENTITY 列的新表。如果 select 语句包括现有 IDENTITY 列和格式为 column_name = identity (precision) 的新 IDENTITY 规范,则语句会失败。
• 如果启用 CIS,而且 into 表驻留在 Adaptive Server 上,则 Adaptive Server 使用批量复制例程将数据复制到新表中。在对远程表使用 select into 前,请将 select into/bulkcopy 数据库选项设置为 true。
• 有关嵌入式 SQL 命令 select into host_var_list 的信息,请参见 Open Client 嵌入式 SQL 参考手册。
使用 select...into 转换目标列的 NULL 属性
• 使用 convert 命令更改要将所选择的数据添加到的目标列的可为空 性。例如,下面的命令可从 titles 表中选择数据,添加到名为 temp_titles 的目标表中,但会将 total_sales 列由 null 转换为 not null:
select title, convert (char (100) not null, total_sales)
total_sales into #tempsales from titles
指定压缩级别
• 您用 select into 创建的目标表不继承源表中的任何配置。也就是说, 如果从中拉出数据的表配置了行级压缩,则从 select into 生成的表并 不配置压缩,除非您显式声明了压缩级别。
• 您可以为目标表指示列级、分区级和表级压缩 (分区的压缩级别会 覆盖表的压缩级别)。
• 当您压缩目标表时, Adaptive Server 会选择列的压缩级别 (如果合 格),无论源表中的对应列的压缩级别如何都是如此。
• select into 命令可以包括在目标表中不压缩的列的列表。
• 不能在目标表上加密压缩列。
参数与数据压缩的交互
• max_rows_per_page 只适用于所有页锁定压缩表;不能将其用在仅数 据锁定表中。
• 可以对具有可变长度列的所有页锁定表和仅数据锁定表使用 exp_row_size。但是,该表必须能够在同一页上扩展更新而不导致所 有页锁定表上发生页面拆分或仅数据锁定表上发生行转移。
exp_row_size 采用相同方式计算压缩表和非压缩表的空间限制。但 是,因为压缩可生成具有大量空间的页,所以,为 exp_row_size 留 出的空间可能会导致只有极少行不超出页面范围 (与不设置 exp_row_size 相比)。
不能对具有固定长度列的表使用 exp_row_size,即使 Adaptive Server
可能会在压缩过程中将某些固定长度列转换为可变长度列。
• fillfactor 用于确定压缩后在数据页上使用的空间。这仅在创建聚簇索 引 (它是需要对数据页进行排序的操作)时才有意义。
使用 select for update
• 对于 Adaptive Server 15.7 和更高版本,如果配置参数 select for update 设置为 1,select for update 选择的行就会被以排它方式锁定,前提条 件是该命令是在事务上下文内在数据行锁定表上执行的,或者在链 式模式中进行的。如果 select for update 在游标上下文内运行,游标 open 和 fetch 语句就必须位于事务上下文内。
• 通过 select for update 选择的行 (在游标上下文之内或之外)会保留 排它锁,直到事务完成为止。
• select for update 的限制:
• select for update 在子查询块中无效。
• select for update 仅在 select 直接从基表中返回,而不是从工作表 中返回时才适用。 select for update 不能和具有集合或 group by、 computed、 union、 having 或 distinct 子句的查询一起使用。
• 比起 select for update,有资格进行实际事务 update 的行可能更 多。这些行可能出现在更新集内。可使用隔离级别 3 来防止这 种 “幻像”行。
• 在 select 处理期间,并发 select for update 任务可能会尝试以不同 顺序锁定一组同样的行,从而导致应用程序死锁。但是,一旦 select for update 完成,对这组行的后续更新不会被阻止,而且不 会遇到死锁。
• 所有现有的针对可更新游标的限制都适用于游标上下文之内或 之外的 select for update。唯一不同之处是,对于 select for update, order by 子句通过可更新游标得到支持。对可更新游标 的限制适用于语言和执行游标。
• select for update 引用的所有表必须来自同一个数据库。
• select for update 仅在其数据行锁定的表上得到支持。
指定行内 LOB 列
• 缺省情况下,目标表中的 LOB 列继承 select 列表中的相应 LOB 列 的存储属性。如果表达式 (如 convert(text, column ) 内置函数)生成 目标表的 LOB 列,则该列会自动使用行外存储。
使用 select...into 指定锁定方案
• 将 lock 选项和 select...into 一起使用时,可以为通过该命令创建的表 指定锁定方案。如果不指定锁定方案,则应用缺省锁定方案 (由配 置参数 lock scheme 设置)。
• 使用 lock 选项时,也可以指定空间管理属性 max_rows_per_page、 exp_row_size 和 reservepagegap。
可以使用 sp_chgattribute 更改用 select into 创建的表的空间管理属性。
使用 select...into 指定分区策略
• partitions_clause 与 select...into 一起使用时,可以为通过该命令创建 的表指定分区属性。(有关详细信息,请参见 create table。)如果未 指定分区类型, Adaptive Server 将创建未分区表。如果要插入的任 何行不满足目标表中任何分区的条件, select...into 将失败。
使用 index、 prefetch 和 lru | mru
• index、 prefetch 和 lru | mru 选项指定用于查询执行的索引、高速缓存 以及 I/O 策略。这些选项会覆盖 Adaptive Server 优化程序作出的选 择。请慎用这些语句,并始终用 set statistics io on 检查性能影响。有 关使用这些选项的详细信息,请参见 《性能和调优指南》。
使用加密列
• 如果使用 encrypt 子句时未指定密钥名称,则 Adaptive Server 将使用 数据库缺省密钥对目标列中的数据进行加密。
• 如果源表中的列已经加密,但是未对目标列指定 encrypt 子句,则 Adaptive Server 将对源表中的数据进行解密,并在目标列中插入纯 文本数据。
• 如果指定对目标列使用源列数据所用的密钥进行加密,并且如果该 密钥未使用初始化矢量或随机填充,则 Adaptive Server 会将源列中 的数据以密文形式复制到目标列,而无需执行中间的解密和重新加 密操作。
• 然而,如果指定对目标列使用与源列所用的密钥不同的密钥进行加 密,或者该密钥在加密过程中使用了初始化矢量或填充,则 Adaptive Server 将对加密列的每个所选行执行解密和加密操作。
使用 parallel
• parallel 选项将减少 Adaptive Server 优化程序可用于并行处理的工作 线程的数目。 degree_of_parallelism 不能大于配置的 max parallel degree。如果指定一个大于配置的 max parallel degree 的值,则优化 程序会忽略 parallel 选项。
• 当多个工作进程合并其结果时, Adaptive Server 返回的行的顺序可 能因执行顺序而异。若要以一致的顺序从分区表中获取行,请使用 order by 子句,或通过在查询的 from 子句中使用 parallel 1 来替换并行 查询执行。
• 出现下列任何情况时,将忽略指定 parallel 的 from 子句:
• 为更新或插入使用了 select 语句。
• 在游标定义中使用了 from 子句。
• parallel 用于子查询的所有内部查询块中的 from 子句。
• select 语句创建了一个视图。
• 该表是外部连接的内部表。
• 查询指定了表的 min 或 max 并指定了索引。
• 指定了未分区的聚簇索引,或者该索引是唯一的 parallel 选项。
• 查询指定表的 exists。
• 配置参数 max scan parallel degree 的值为 1,并且查询指定了索引。
• 包括了非聚簇索引。有关索引覆盖的信息,请参见 《性能和调 优指南》中的 “索引”。
• 此表为系统表或虚拟表。
• 用 OR 策略处理了查询。有关 OR 策略的解释,请参见 《性能 和调优指南》。
• 查询为用户返回了大量的行。
使用 readpast
• readpast 选项允许 select 命令访问指定的表而不会被其它任务持有的 不兼容锁阻塞。 readpast 查询只能在仅数据锁定表上执行。
• 如果对所有页锁定表指定了 readpast 选项,此 readpast 选项将被忽 略。此命令在为此命令或会话指定的隔离级别下执行。如果隔离级 别是 0,则执行脏读,命令从锁定行返回值并且不会阻塞。如果隔 离级别为 1 或 3,则在必须读取具有不兼容锁的页时,命令将阻塞。
• 会话级隔离级别与 select 命令中的表的 readpast 的交互作用如 表 1-29
所示。
表 1-29: 会话级隔离级别的影响和 readpast
会话隔离级别 效果
0, read uncommitted
(脏读)
将忽略 readpast,向用户返回包含未提交事务的行。输出警告消息。
1, read committed 将跳过带有不兼容锁的行或页;在被读取的行或页上不持有锁。
使用 readpast 可能会产生重复,且增加 distinct 子句亦无法清除此问题。 若要解决这一问题,在使用 readpast 命令时,除了 distinct 子句以外还应使用 group by 子句以避免重复。
2, repeatable read 跳过持有不兼容锁的行或页;所读取的所有行或页上都持有共享锁,直到语句或 事务结束为止;语句所读取的所有页上都持有锁,直到事务完成为止。
3, serializable 将忽略 readpast,命令在级别 3 执行。命令将在任何带有不兼容锁的行或页上阻塞。
• 如果指定 readpast 的 select 命令还包括以下任何内容,这些命令将 失败并显示错误消息:
• at isolation 子句,指定 0 或 read uncommitted
• at isolation 子句,指定 3 或 serializable
• 同一表上的 holdlock 关键字
• 如果在指定 readpast 的 select 查询中指定 at isolation 2 或 at isolation repeatable read,则 readpast 表会持有共享锁,直至语句或事务完成 为止。
• 如果带有 readpast 选项的 select 命令遇到带有不兼容锁的文本列,则 readpast 锁定将检索行,但返回值为 null 的文本列。在这种情况下, 由于列被锁定,因此包含空值的文本列和返回的空值之间没有区别。
扩展的 select * 语法
当存储过程或触发器的源文本存储在系统表 syscomments 中时,使用 select * 的查询将存储在 syscomments 中,同时扩展在 select * 中引用的列 列表。
例如,包含列 col1 和 col2 的表中的 select * 将存储为:
select <table>.col1, <table>.col2 from <table>
在 Adaptive Server 版本 12.5.4 中,增强了列-列表扩展功能,以检查标识 符 (表名、列名等)是否符合标识符规则。
例如,如果一个表包括列 col1 和 2col,第二个列名以数字开头,该列名 只能用括号括起来才能用在 create table 语句中。
当在存储过程或触发器中对此表执行 select * 时, syscomments 中的文本 与以下内容类似:
select <table>.col1, <table>[2col] from <table>
对于用于扩展 select * 的文本中的所有标识符,当标识符不符合标识符 规则时,将会添加括号。
必须用括号括起标识符,以确保 Adaptive Server 在升级至更新版本时可 以使用该 SQL 文本。
标准 符合 ANSI SQL 的级别符合初级标准。
Transact-SQL 扩展包括:
• 创建新表的 select into
• lock 子句
• compute 子句
• 全局变量与局部变量
• index 子句、 prefetch、 parallel 和 lru | mru
• holdlock、 noholdlock 和 shared 关键字
• "column_heading = column_name"
• 限定表名和列名
• for browse 子句中的 select
• 在选择列表中使用不在 group by 列表中并且也未使用集合函数的列
• at isolation repeatable read | 2 选项
权限 对 select 的权限检查因您的细化权限设置而异。
细化权限已启用 在启用细化权限的情况下,您必须是表或视图的所有者。
您必须是对表或视图具有 select 权限的用户。
细化权限已禁用 在禁用细化权限的情况下,您必须是表或视图的所有者或拥有 sa_role 的用户。 您必须是对表或视图具有 select 权限的用户。
select 权限缺省情况下将授予表或视图的所有者,获得授权的所有者可将此权 限移交给其他用户。
审计 sysaudits 的 event 和 extrainfo 列中的值如下:
事件 |
审计选项 |
审计的命令或访问权限 |
extrainfo 中的信息 |
62 |
select |
从表中选择数据的 select 命令 |
• 角色 – 当前活动角色 • 关键字或选项 – select、 select into 或 readtext • 先前值 – NULL • 当前值 – NULL • 其它信息 – NULL • 代理信息 – set proxy 有效时的初始登录名 |
63 |
select |
从视图中选择数据的 select 命令 |
• 角色 – 当前活动角色 • 关键字或选项 – select、 select into 或 readtext • 先前值 – NULL • 当前值 – NULL • 其它信息 – NULL • 代理信息 – set proxy 有效时的初始登录名 |
另请参见 命令 compute clause、 create index、 create trigger、 delete、 group by 和
having 子句、 insert 、 order by 子句、 set 、 union 运算符、 update 、 where 子句.
函数 avg、 count、 isnull、 max、 min、 sum.
系统过程 sp_cachestrategy, sp_chgattribute, sp_dboption.
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)上提取数据的非常规恢复工具
- 适用于所有的SQL Anywhere版本 包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x,17.x
- 适用于所有的UltraLite版本
- 能够恢复出来表结构和数据
- 能够恢复自定义数据类型
- 能够恢复存储过程等对象的语法
- 能够导出到目标数据库
- 能够导出到SQL文件并生成导入脚本
- 支持多种字符集,包括:cp850、cp936、gb18030、utf8等
- 能够恢复未加密或者简单加密类型的数据
- 简单易用
- 限制:不支持AES加密的数据文件
SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍
Sybase SQL Anywhere数据库恢复工具ReadASADB适用场景
各种误操作:
- 误截断表(truncate table)
- 误删除表(drop table)
- 错误的where条件误删数据
- 误删除db或log文件
- 误删除表中的字段
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的主要功能:
- 被勒索病毒加密数据文件及备份文件情况下的恢复;
- 系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
- 因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
- delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复 等;
- 各种Sybase内部系统表损坏、索引错误的修复;
- master数据库损坏而无法正常运行情况下的恢复;
- Sybase数据库被标记为可疑,不可用等情况的恢复;
- Sybase数据库中数据文件内部出现坏块情况下的恢复;
- Sybase数据库无数据文件但有日志文件的情况下的恢复;
- Sybase数据库只有数据文件无任何日志文件的情况下的恢复;
- Sybase数据文件被误删除情况下的碎片提取恢复;
- 磁盘阵列上的Sybase数据库被误格式化情况下的数据库恢复;
- 数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
- Sybase数据库还原数据库出现失败情况下的恢复;
- 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.xSQL Server数据库恢复工具SQLRescue:
一个不依赖数据库管理系统、直接从SQL Server数据库文件上提取数据的业内领先的恢复工具!能够从损坏的SQL Server数据库文件(.mdf)上提取数据的非常规恢复工具。
SQL Server数据库恢复工具SQLRescue的主要功能:
- 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;
- 断电导致数据库文件损坏情况下的恢复;
- 硬盘坏道造成数据库损坏情况下的恢复;
- 数据文件内部存在坏页情况下的恢复;
- 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;
- 并闩锁错误、格式化、误删除后导致软件不能使用的情况;
- 无法读取并闩锁页sysindexes失败情况下的修复;
- 数据文件被误删除情况下的碎片提取恢复;
- 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;
- master数据库损坏而无法正常运行情况下的恢复;
- 数据文件无法附加情况下的数据恢复;
- 数据库被标记为可疑,质疑,不可用等情况的恢复;
- 数据库sysobjects等系统表损坏情况下的恢复;
- 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;
- 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;
- 数据库被误格式化等情况下的数据库恢复;
- 日志收缩造成数据库损坏情况下的恢复;
- 仅剩损坏的备份文件情况下的恢复。
SQL Server数据库恢复工具SQLRescue技术特点:
只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。- 从数据文件中直接恢复数据
- 不能附加时直接恢复数据并生成新的数据库
- 系统表损坏的数据库修复
- 快速修复SQL 823错误、连接中断错误
SQL Server数据库恢复工具SQLRescue支持的版本:
Microsoft SQL Server 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017,2019。+-------------------------------------华丽的分割线-------------------------------------------------------------------------