sql问题
http://www.kmdd.cn/disContex.asp?Teach_ID=63
1. 系统存储过程的类别来源何处?
问题:
系统存储过程分为四类:
目录过程、扩展过程、复制过程和系统过程,但阐述很不清晰。请问北大青鸟APTECH的老师,该概念来自何处?
答复:
正像我们在教材中描述的那样把系统存储过程主要分为四类,但实际上以MSDN中的分类还要多,教材中准确的介绍了比较常见的四种,下面作一个解释。
目录过程:作用同教材描述。
Sp_databases:列出驻留在 Microsoft® SQL Server™ 实例中的数据库或可以通过数据库网关访问的数据库
语法:sp_databases
返回代码值:无
注释:在 SQL Server 中,sp_databases 返回在 sysdatabases 系统表中列出的数据库。由于数据库网关所访问的一些数据库管理系统 (DBMS) 没有数据库概念,所以如果发送到基于 Microsoft 开放式数据服务的网关,该存储过程可能不返回任何行。所返回的数据库名称可以作为 USE 语句的参数,用来更改当前数据库上下文。
权限:执行权限默认授予 public 角色。
扩展过程:作用同教材描述。
Xp_logininfo:报告帐户、帐户类型、帐户的特权级别、帐户的映射登录名和帐户访问 Microsoft® SQL Server™ 的权限路径。
语法:xp_logininfo [[@acctname =] 'account_name'] [,@option =] 'all' | 'members'][,[@privelege =] variable_name OUTPUT]
返回代码值:0(成功)或 1(失败)
注释:如果指定 account_name 作为第一个参数,则 xp_logininfo 报告该帐户的最高访问特权等级。如果用户有系统管理员访问权限和用户访问权限,则只报告系统管理员级(最高特权)条目。如果用户属于多个拥有相同特权等级的组,则只报告第一个匹配的组(组的顺序按向这些组授予 SQL Server 访问权限的顺序决定),并最多返回一行结果。如果 account_name 是有效 Windows NT 帐户,但该帐户没有访问 SQL Server 的权限,则返回空结果集。如果account_name 无法识别为有效的 Windows NT 帐户,则返回错误信息。如果指定了 account_name 和 all,则列出该帐户的所有权限路径。如果 account_name 是多个组的成员,并且所有这些组都有访问 SQL Server 的权限,则返回多个行。Admin 特权行在 user 特权行之前报告,而同一特权等级内的行顺序由向帐户授予 SQL Server 访问权限的顺序决定。Account_name 既适用于单个用户也适用于组。如果指定了 account_name 和 members,则返回组的下一级成员列表。如果 account_name 是本地组,则该列表可以包含本地用户、域用户和全局组。如果 account_name 是全局帐户,则该列表由域用户组成。如果 account_name 是用户帐户,则返回错误信息。
权限:xp_logininfo 的执行权限默认授予 master 数据库中的db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员,但可以授予其他用户。
示例:下例显示有关 BUILTIN\Administrators Windows NT 组的信息。EXEC xp_logininfo 'BUILTIN\Administrators'
复制过程:作用同教材描述。
Sp_replcmds:将在给定的数据库内运行 sp_replcmds 的第一个客户端视为日志读取器。返回被标记为复制的事务的命令。此存储过程在发布服务器的发布数据库上执行。
语法:sp_replcmds [ @maxtrans = ] maxtrans
结果集:sp_replcmds 由日志读取器进程使用。此过程返回有关其执行时所在的发布数据库的信息。它使您得以查看当前没有随命令分发的事务(那些保留在事务日志中的、没有被发送到分发服务器的事务),并且返回项目 ID、partial_command(真或假)、命令、页、行和时间截。
注释:sp_replcmds 用于事务复制。此过程可以为所有者限定的表或未限定的表名(默认值)生成命令。添加限定的表名允许将数据从一个数据库内的特定用户所拥有的表复制到这个用户在另一个数据库内所拥有的表中。
权限:只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_replcmds。
系统过程:作用同教材描述。
Sp_helpserver:报告某个特定远程或复制服务器的信息,或者报告两种类型的所有服务器的信息。提供服务器名称、服务器网络名、服务器复制状态、服务器标识号、排序规则名称和连接到链接服务器的超时值或对链接服务器进行查询的超时值。
语法:sp_helpserver [ [ @server = ] 'server' ]
[ , [ @optname = ] 'option' ]
[ , [ @show_topology = ] 'show_topology' ]
返回代码值:0(成功)或 1(失败)
注释:一个服务器可以有多种状态。
权限:执行权限默认授予 public 角色。
示例
A. 显示所有服务器的信息
下面的示例显示所有服务器的信息(sp_helpserver 不带参数)。
USE master
EXEC sp_helpserver
B. 显示某个特定服务器的信息
下面的示例显示服务器 SEATTLE2 的所有信息。
USE master
EXEC sp_helpserver 'SEATTLE2'
以上是关于您的问题的答复。
再次感谢您积极的参与到学术讨论中来,同时建议您在教授本课程时结合MSDN或SQLServer联机丛书,在那里可以找到教材中没有提到的其他系统存储过程。
2.
问题:
NT Server名称为AAA,今将其重新命名为BBB,试问如何进行设置方可使其SQL Server service正常启动?(不重新运行setup的情况下)
答复:
我们建议您这样试试:
把SQLServer升级为2000,在2000下可以安装多个实例,比如ServerA、ServerB等。可以和操作系统的名字不一致。
3.
问题:
1.select语句中的optimizer_hints选项有何作用?如何用?
2.“select 语句提供了各种解除锁定的方法”是什么意思?
答复:
实际上optimizer_hints分别是table_hint(表提示)和view_hint(视图提示)。
Table_hint: 指定表扫描、查询优化器要使用的一个或多个索引或查询优化器要对此表、此语句使用的锁定方法。
语法
< table_hint > ::=
{ INDEX ( index_val [ ,…n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
参数
INDEX ( index_val [ ,…n ] )
指定 SQL Server 在处理语句时使用的索引的名称或 ID。只能为每个表指定一个索引提示。
如果存在聚集索引,则 INDEX(0) 强制聚集索引扫描,而 INDEX(1) 强制聚集索引扫描或查找。如果不存在聚集索引,则 INDEX(0) 强制表扫描,而 INDEX(1) 则被解释为错误。
选择性的 INDEX = 语法(用于指定单一索引提示)只受向后兼容性的支持。
如果在单一提示列表中使用了多个索引,则将忽略重复项,所列出的其余索引将用于检索表中的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引集合不是覆盖性的,则在检索全部索引列后执行一次提取操作。
说明 如果在星型联接的事实数据表中使用引用多个索引的索引提示,则 SQL Server 将忽略该索引提示并返回一条警告消息。此外,不允许在指定了索引提示的表上使用索引 OR 运算。
表提示中的最大索引数为 250 个非聚集索引。
FASTFIRSTROW
等同于 OPTION (FAST 1)。有关更多信息,请参见 SELECT 中 OPTION 子句的 FAST。
HOLDLOCK
等同于 SERIALIZABLE。(有关更多信息,请参见本主题下面的 SERIALIZABLE。)HOLDLOCK 选项仅适用于指定了该选项的表或视图,且仅限于由它所在语句所定义的事务的时间段内。HOLDLOCK 不能用于包括 FOR BROWSE 选项的 SELECT 语句。
NOLOCK
等同于 READUNCOMMITTED。有关更多信息,请参见本主题后面的 READUNCOMMITTED。
PAGLOCK
在通常采取单个共享表锁的地方采取共享页锁。
READCOMMITTED
指定用与运行在 READ COMMITTED 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
READPAST
指定跳过(越过读取)锁定的行。例如,假设表 T1 包含单个整数列,其值为 1、2、3、4 和 5。如果事务 A 将值 3 更改为 8,但尚未提交,则 SELECT * FROM T1 (READPAST) 将生成值 1、2、4 和 5。READPAST 仅适用于在 READ COMMITTED 隔离级别操作的事务,且只越过读取行级锁。该锁提示主要用于在 SQL Server 表中实现工作队列。
READUNCOMMITTED
指定允许只读。这表示不发放共享锁,也不遵守排它锁。允许只读会导致更高的并发性,但会降低一致性。如果指定了 READUNCOMMITTED,就有可能读取未提交的事务,或读取在读取过程中回滚的一套页,因此可能出现错误信息。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
说明 如果在指定了 READUNCOMMITTED 的情况下收到 601 号错误信息,则按解决死锁错误 (1205) 的方法解决该错误,然后重试执行语句。
REPEATABLEREAD
指定用与运行在 REPEATABLE READ 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
ROWLOCK
指定在通常采取单个共享页或表锁的情形下采取共享行锁。
SERIALIZABLE
等同于 HOLDLOCK。通过将共享锁保持到事务完成,使之更具有约束性(而不要不管事务是否完成,都在不再需要所需的表或数据页时就立即释放共享锁)。用与运行在 SERIALIZABLE 隔离级别的事务相同的语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
TABLOCK
指定在表上采取的共享锁一直保持到语句结束。如果同时指定 HOLDLOCK,那么在事务结束之前该共享表锁将一直保持。
TABLOCKX
指定在表上采取的排它锁一直保持到语句结束或事务结束。
UPDLOCK
指定读取表时采取更新锁而不是共享锁,且将这些更新锁保持到语句结束或事务结束。
XLOCK
指定应采取排它锁,且保持到由语句所处理的全部数据上的事务结束。如果与 PAGLOCK 或 TABLOCK 一同指定,则排它锁适用于适当的粒度级别。
View_hint:指定索引视图扫描。默认情况下,视图在查询优化器处理查询之前展开。
语法
< view_hint > ::=
{ NOEXPAND [ , INDEX ( index_val [ ,…n ] ) ] }
参数
NOEXPAND
指定当查询优化器处理查询时不扩展索引视图。查询优化器将视图作为具有聚集索引的表。
INDEX ( index_val [ ,…n ] )
指定 SQL Server 在处理语句时要使用的索引名称或 ID。只能为一个视图指定一个索引提示。
INDEX(0) 强制执行聚集索引扫描,而 INDEX(1) 强制执行聚集索引扫描或查找。
如果在单个提示列表中使用了多个索引,将忽略重复项,其余列出的索引将用于检索索引视图的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引的集合并不包含查询中所引用的全部列,则在检索全部索引列后执行一次提取操作。
锁定是由并发问题产生的,如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括:丢失或覆盖更新、未确认的相关性(脏读)、不一致的分析(非重复读)、幻像读。
可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级锁定提示的范围,以引导 Microsoft SQL Server 2000 使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。
SQL Server 查询优化器自动作出正确的决定。建议仅在必要时才使用表级锁定提示更改默认的锁定行为。禁止锁定级别反过来会影响并发。
例如,如果将事务隔离级别设置为 SERIALIZABLE,并且在 SELECT 语句中使用表级锁定提示 NOLOCK,则键范围锁通常用于维护不采用可串行事务。
USE pubs
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
SELECT au_lname FROM authors WITH (NOLOCK)
GO
生成的锁是:
EXEC sp_lock
GO
SELECT object_name(117575457)
GO
4.
问题:
上机时,有时会出现这样的问题:在diagrams窗口中添加表时,在窗口中看不到添加的表,甚至弹出出错窗口,提示错误信息:尚未调用Coinitialize
这是什么原因?如何解决?
答复:
我主意到你讲的是有时,说明和系统的稳定性有关,建议先排除操作系统和硬件,尤其是内存的可能性,再观察是否还存在所述现象
5.
问题:
SQL Server2000中的一个数据库中只允许有一个主数据文件,但在查询分析器中建立数据库时建立多个*.mdf文件时并不提示出错,然后打开企业管理器查看时,会列出多个*.mdf文件。为什么会这样呢?
答复:
理论上一个数据库包含一个.mdf多个.ndf和多个.ldf,您不妨把Create database的t-sql语句写出来,我们可以一同探讨。
据我所知,主文件与次要文件的区别不在于其扩展文件名,而在于创建数据库时的定义,微软用.MDF来表示主文件只是一种约定而已。实际上,不管主文件与次要文件,只要能区分就可以了。
主要数据文件不等于扩展名.mdf文件,教材阐述错误,准确地提法应是:主要数据文件推荐使用.mdf扩展名,次要数据推荐使用.ndf扩展名,但每个数据库确实有且仅有一个主要数据文件,这个数据文件你可命名为.mdf文件,也可命名为.ndf甚至.ldf文件,只要你不嫌烦。
同意第二和第三回复的解释,.mdf.ndf.ldf是微软推荐使用的扩展名,在使用create database语句创建数据库时按照默认的命名原则清晰易懂方便管理,这是一个普遍和特殊的问题,但在学生刚刚接触数据定义语言时还是按照常规做法为好,尤其是主数据文件和日志数据文件之间的关系和区别,避免混淆。
6.
问题:
我中心在SQL Server教学过程,遇到了如下问题:
有一句话“一个表中只能有一列定义有DEFAULT约束。”怎样理解,是否应该是‘一个表中只能定义一次DEFAULT约束在一个列中。’?可以给出英文原文吗?
答复:
您所述正确。
7.SQL索引中的一个问题
问题:
CREATE INDEX语句中,有一个可选项:IGNORE_DUP_KEY,意思是:选上该项的话,在唯一的聚集索引中,拒绝使用重复键插入或更新的行。如果是没有选上该项,则在重复键插入或更新行时,会弹出警告信息。二者的结果都是禁止重复键插入或更新,有没有本质上的区别或其他不同?
答复:
二者的区别在于出现重复键时,虽然最后结果都不能插入,但数据库呈现的行为不一样。如无此选项,则会“回滚”(结果是先插入再取消)插入并发出“错误”信息。有此选项,则会发出“警告”信息,且不允许插入(没有插入行为)。
8.关于IDENTITY属性的问题
问题:
关于已创建了表,然后向表中已有的列添加IDENTITY属性,此操作不可实现,因为列名已存在。如想实现向表中现有的列添加IDENTITY属性怎样实现?谢谢!
还有个问题请教,表中列名是否可以使用T-SQL语句修改。
答复:
对您所述问题的解决办法是:可把上述修改表的语句中的ADD关健字修改成ALTER COLUMN关键字即可。
可以通过下面的t-sql做到修改现有列为identity列:
第一步:
create table student
(
studid int not null,
firstname varchar(20) not null,
lastname varchar(20) not null
)
第二步:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_student
(
stduid int NOT NULL IDENTITY (1, 1),
firstname varchar(20) NOT NULL,
lastname varchar(20) NOT NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT dbo.Tmp_student ON
GO
IF EXISTS(SELECT * FROM dbo.student)
EXEC('INSERT INTO dbo.Tmp_student (stduid, firstname, lastname)
SELECT stduid, firstname, lastname FROM dbo.student TABLOCKX')
GO
SET IDENTITY_INSERT dbo.Tmp_student OFF
GO
DROP TABLE dbo.student
GO
EXECUTE sp_rename N'dbo.Tmp_student', N'student', 'OBJECT'
GO
COMMIT
9.关于用户定义的数据类型
问题:
用sp_addtype存储过程创建用户定义的数据类型时,其中的null_type的取值为NULL或NOT NULL。请问是什么意思?有什么作用?
答复:
用户自定义数据类型是基于系统数据类型集创建的,实际上是系统数据类型的别名而已。
为空性指用户自定义数据类型处理空值的方式。如果为空性未明确定义,系统将依据数据库或连接的 ANSI Null 默认设置进行指派。
10.
问题:
我中心在授课时有如下问题:
在SQL Serverr 内部测试中(机试一):
‘第三部分:3.创建一个UpadStartDt触发器,反映任何在cruise_book表和customer表中开始日期的更改。’
请问:在一个触发器上能反映出两个表的更改吗?是否此处有错误?
另外:第二部分:6.通过视图update_cruise修改cruise表的数据。这个update_cruise视图是新建的吗?
请问如何在视图上创建触发器?——是SQL Server新推出的功能吗?
答复:
您好,第一个问题可以这样设想,创建一个视图,包括cruise_book的开始日期和customer的开始日期。将UpadStartDt触发器创建在该视图的基础上可以实现。
视图是学生创建的
在视图上创建触发器确实是SQLServer2000的新增功能,在SQLServer7中不支持。
在SQLServer2000中的语法如下:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ …n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ …n ]
} ]
sql_statement [ …n ]
}
}
其中参数:
Table | view
是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
建议在目前的教材中不要采用上面的实现方式,还是创建触发器表来实现,可以创建两个触发器。
11.
问题:
select语句提供了各种解除数据锁定的方法,不知能否有例子说明一下。
Select 语句可以加锁,查询结束后,可以自动解锁,但如何解除已被别人加的锁定?
答复:
select语句可提供加锁的功能,如:select * from student where ID="001" holdlock。这是一个默认选项。但也可以解锁,如:select * from student where ID="001" unlock。但这样读出数据无法避免“脏读”(读取了未提交的数据)。可在“查询分析器”中打开帮助,搜索“锁定提示”。
12.关于sql server配置器
问题:
请教一个问题, SQLSERVER配置器是指什么?
答复:
要想打开SQLSERVER配置器,请运行“企业管理器”,然后用鼠标选中左边窗口目录中的服务器(图标是个绿色三角),点鼠标右键,从弹出菜单中选“属性”,即为SQLSERVER配置器。
是事件探查器 sql server Profiler
13.
问题:
如何取出电子邮件地址中之后的的值.
答复:
执行如下SQL语句即可:
select cust_nm,substring(e_mail,charindex('@',e_mail)+1,len(e_mail)-charindex('@',e_mail)) from customer
14.
问题:
1)在master数据库中以sp_开头的系统存储过程,那么其它的呢?比如以dt_开头的。
2)日期和时间参数设定后,我通过什么命令可以检查我对这两个参数的设置?
3)“ANSI”是指什么?是一种字符集标准?
答复:
1)dt_也是一种存储过程,但不是在master数据库中,而是在用户数据库中,如Northwind。Dt_存储过程(如dt_adduserobject)一般在用户创建数据库时由系统自动生成,主要用于处理用户数据库中系统自动生成的一些系统表(如dtproperties),起到实时维护系统环境的作用。
2)下例是关于系统日期格式、星期的第一天的设置及显示的例子:
set dateformat ydm /*设置日期输入格式为年日月*/
set datefirst 4 /*设置星期的第一天为星期四*/
select convert(char(50), datepart(dw,'2002-16-5')) from depart /*显示2002-16-5这一天是星期的第几天,from后面可为任一存在的表*/
3)ANSI是一种字符集标准,是美国国家标准字符集(American National Standards Institute),使用一个字节的长度表示256个字符。另外,美国信息交换用标准码 (ASCII)是7位字符集,广泛用于表示标准 U.S. 键盘上的字母和符号。ASCII 字符集与 ANSI 字符集中的前 128 个字符(0 到 127)相同。
15.
问题:
1)系统是依据什么准则将数据库对象(如表、存储过程等)放入主要文件或次要文件?
2)文件组的概念。它到底是如何优化系统性能的?
3)对“FOR LOAD”和“FOR ATTACH”的概念不太理解。
答复:
Microsoft® SQL Server™ 2000 使用一组操作系统文件映射数据库。数据库中的所有数据和对象(如表、存储过程、触发器和视图)都存储在下列操作系统文件中:
1)主要
该文件包含数据库的启动信息,并用于存储数据。每个数据库都有一个主要数据文件。
2)次要
这些文件含有不能置于主要数据文件中的所有数据。如果主文件可以包含数据库中的所有数据,那么数据库就不需要次要数据文件。有些数据库可能足够大故需要多个次要数据文件,或使用位于不同磁盘驱动器上的辅助文件将数据扩展到多个磁盘。
3)事务日志
这些文件包含用于恢复数据库的日志信息。每个数据库都必须至少有一个日志文件。
例如,创建简单的数据库 sales 时,可以只使用一个包含所有数据和对象的主文件和一个包含事务日志信息的日志文件。另一种情况是,创建更复杂的数据库 orders 时,可以使用一个主文件和五个辅助文件,数据库内的数据和对象扩展到所有的六个文件中,另外有四个日志文件包含事务日志信息。
允许对文件进行分组,以便于管理和数据的分配/放置。例如,可以分别在三个硬盘驱动器上创建三个文件(Data1.ndf、Data2.ndf 和 Data3.ndf),并将这三个文件指派到文件组 fgroup1 中。然后,可以明确地在文件组 fgroup1 上创建一个表。对表中数据的查询将分散到三个磁盘上,因而性能得以提高。在 RAID(独立磁盘冗余阵列)条带集上创建单个文件也可以获得相同的性能改善。然而,文件和文件组使您得以在新磁盘上轻易地添加新文件。另外,如果数据库超过单个 Microsoft Windows NT® 文件的最大大小,则可以使用次要数据文件允许数据库继续增长。
FOR LOAD在SQL SERVER6.5的create database命令中用于将已存在的数据库文件或备份的数据库恢复到系统中,而不是重新创建一个数据库。在SQL SERVER7.0以上的版本中,则往往通过restore命令来恢复一个数据库,很少用到FOR LOAD选项。保留该选项是为了和老版本兼容。
FOR ATTACH选项用于附加数据库,将现有的一些操作系统文件(从数据库中分离出来的数据库文件)附加到一个数据库中。附加的数据库必须使用与 SQL Server 相同的代码页和排序次序创建。否则,附加操作将失败。
下例使用for attach选项创建一个包含下列物理文件的名为 Archive 的数据库:
c:\program files\microsoft sql server\mssql\data\archdat1.mdf
c:\program files\microsoft sql server\mssql\data\archdat2.ndf
c:\program files\microsoft sql server\mssql\data\archdat3.ndf
c:\program files\microsoft sql server\mssql\data\archlog1.ldf
c:\program files\microsoft sql server\mssql\data\archlog2.ldf
可以使用 sp_detach_db 存储过程分离该数据库,然后使用带有 FOR ATTACH 子句的 CREATE DATABASE 重新附加。
Sp_detach_db Archive
GO
CREATE DATABASE Archive
ON PRIMARY (FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat1.mdf')
FOR ATTACH
GO
相关内容可查看SQL SERVER的联机帮助,有很详细的说明。
1. 系统存储过程的类别来源何处?
问题:
系统存储过程分为四类:
目录过程、扩展过程、复制过程和系统过程,但阐述很不清晰。请问北大青鸟APTECH的老师,该概念来自何处?
答复:
正像我们在教材中描述的那样把系统存储过程主要分为四类,但实际上以MSDN中的分类还要多,教材中准确的介绍了比较常见的四种,下面作一个解释。
目录过程:作用同教材描述。
Sp_databases:列出驻留在 Microsoft® SQL Server™ 实例中的数据库或可以通过数据库网关访问的数据库
语法:sp_databases
返回代码值:无
注释:在 SQL Server 中,sp_databases 返回在 sysdatabases 系统表中列出的数据库。由于数据库网关所访问的一些数据库管理系统 (DBMS) 没有数据库概念,所以如果发送到基于 Microsoft 开放式数据服务的网关,该存储过程可能不返回任何行。所返回的数据库名称可以作为 USE 语句的参数,用来更改当前数据库上下文。
权限:执行权限默认授予 public 角色。
扩展过程:作用同教材描述。
Xp_logininfo:报告帐户、帐户类型、帐户的特权级别、帐户的映射登录名和帐户访问 Microsoft® SQL Server™ 的权限路径。
语法:xp_logininfo [[@acctname =] 'account_name'] [,@option =] 'all' | 'members'][,[@privelege =] variable_name OUTPUT]
返回代码值:0(成功)或 1(失败)
注释:如果指定 account_name 作为第一个参数,则 xp_logininfo 报告该帐户的最高访问特权等级。如果用户有系统管理员访问权限和用户访问权限,则只报告系统管理员级(最高特权)条目。如果用户属于多个拥有相同特权等级的组,则只报告第一个匹配的组(组的顺序按向这些组授予 SQL Server 访问权限的顺序决定),并最多返回一行结果。如果 account_name 是有效 Windows NT 帐户,但该帐户没有访问 SQL Server 的权限,则返回空结果集。如果account_name 无法识别为有效的 Windows NT 帐户,则返回错误信息。如果指定了 account_name 和 all,则列出该帐户的所有权限路径。如果 account_name 是多个组的成员,并且所有这些组都有访问 SQL Server 的权限,则返回多个行。Admin 特权行在 user 特权行之前报告,而同一特权等级内的行顺序由向帐户授予 SQL Server 访问权限的顺序决定。Account_name 既适用于单个用户也适用于组。如果指定了 account_name 和 members,则返回组的下一级成员列表。如果 account_name 是本地组,则该列表可以包含本地用户、域用户和全局组。如果 account_name 是全局帐户,则该列表由域用户组成。如果 account_name 是用户帐户,则返回错误信息。
权限:xp_logininfo 的执行权限默认授予 master 数据库中的db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员,但可以授予其他用户。
示例:下例显示有关 BUILTIN\Administrators Windows NT 组的信息。EXEC xp_logininfo 'BUILTIN\Administrators'
复制过程:作用同教材描述。
Sp_replcmds:将在给定的数据库内运行 sp_replcmds 的第一个客户端视为日志读取器。返回被标记为复制的事务的命令。此存储过程在发布服务器的发布数据库上执行。
语法:sp_replcmds [ @maxtrans = ] maxtrans
结果集:sp_replcmds 由日志读取器进程使用。此过程返回有关其执行时所在的发布数据库的信息。它使您得以查看当前没有随命令分发的事务(那些保留在事务日志中的、没有被发送到分发服务器的事务),并且返回项目 ID、partial_command(真或假)、命令、页、行和时间截。
注释:sp_replcmds 用于事务复制。此过程可以为所有者限定的表或未限定的表名(默认值)生成命令。添加限定的表名允许将数据从一个数据库内的特定用户所拥有的表复制到这个用户在另一个数据库内所拥有的表中。
权限:只有 sysadmin 固定服务器角色成员或 db_owner 固定数据库角色成员才能执行 sp_replcmds。
系统过程:作用同教材描述。
Sp_helpserver:报告某个特定远程或复制服务器的信息,或者报告两种类型的所有服务器的信息。提供服务器名称、服务器网络名、服务器复制状态、服务器标识号、排序规则名称和连接到链接服务器的超时值或对链接服务器进行查询的超时值。
语法:sp_helpserver [ [ @server = ] 'server' ]
[ , [ @optname = ] 'option' ]
[ , [ @show_topology = ] 'show_topology' ]
返回代码值:0(成功)或 1(失败)
注释:一个服务器可以有多种状态。
权限:执行权限默认授予 public 角色。
示例
A. 显示所有服务器的信息
下面的示例显示所有服务器的信息(sp_helpserver 不带参数)。
USE master
EXEC sp_helpserver
B. 显示某个特定服务器的信息
下面的示例显示服务器 SEATTLE2 的所有信息。
USE master
EXEC sp_helpserver 'SEATTLE2'
以上是关于您的问题的答复。
再次感谢您积极的参与到学术讨论中来,同时建议您在教授本课程时结合MSDN或SQLServer联机丛书,在那里可以找到教材中没有提到的其他系统存储过程。
2.
问题:
NT Server名称为AAA,今将其重新命名为BBB,试问如何进行设置方可使其SQL Server service正常启动?(不重新运行setup的情况下)
答复:
我们建议您这样试试:
把SQLServer升级为2000,在2000下可以安装多个实例,比如ServerA、ServerB等。可以和操作系统的名字不一致。
3.
问题:
1.select语句中的optimizer_hints选项有何作用?如何用?
2.“select 语句提供了各种解除锁定的方法”是什么意思?
答复:
实际上optimizer_hints分别是table_hint(表提示)和view_hint(视图提示)。
Table_hint: 指定表扫描、查询优化器要使用的一个或多个索引或查询优化器要对此表、此语句使用的锁定方法。
语法
< table_hint > ::=
{ INDEX ( index_val [ ,…n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
参数
INDEX ( index_val [ ,…n ] )
指定 SQL Server 在处理语句时使用的索引的名称或 ID。只能为每个表指定一个索引提示。
如果存在聚集索引,则 INDEX(0) 强制聚集索引扫描,而 INDEX(1) 强制聚集索引扫描或查找。如果不存在聚集索引,则 INDEX(0) 强制表扫描,而 INDEX(1) 则被解释为错误。
选择性的 INDEX = 语法(用于指定单一索引提示)只受向后兼容性的支持。
如果在单一提示列表中使用了多个索引,则将忽略重复项,所列出的其余索引将用于检索表中的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引集合不是覆盖性的,则在检索全部索引列后执行一次提取操作。
说明 如果在星型联接的事实数据表中使用引用多个索引的索引提示,则 SQL Server 将忽略该索引提示并返回一条警告消息。此外,不允许在指定了索引提示的表上使用索引 OR 运算。
表提示中的最大索引数为 250 个非聚集索引。
FASTFIRSTROW
等同于 OPTION (FAST 1)。有关更多信息,请参见 SELECT 中 OPTION 子句的 FAST。
HOLDLOCK
等同于 SERIALIZABLE。(有关更多信息,请参见本主题下面的 SERIALIZABLE。)HOLDLOCK 选项仅适用于指定了该选项的表或视图,且仅限于由它所在语句所定义的事务的时间段内。HOLDLOCK 不能用于包括 FOR BROWSE 选项的 SELECT 语句。
NOLOCK
等同于 READUNCOMMITTED。有关更多信息,请参见本主题后面的 READUNCOMMITTED。
PAGLOCK
在通常采取单个共享表锁的地方采取共享页锁。
READCOMMITTED
指定用与运行在 READ COMMITTED 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
READPAST
指定跳过(越过读取)锁定的行。例如,假设表 T1 包含单个整数列,其值为 1、2、3、4 和 5。如果事务 A 将值 3 更改为 8,但尚未提交,则 SELECT * FROM T1 (READPAST) 将生成值 1、2、4 和 5。READPAST 仅适用于在 READ COMMITTED 隔离级别操作的事务,且只越过读取行级锁。该锁提示主要用于在 SQL Server 表中实现工作队列。
READUNCOMMITTED
指定允许只读。这表示不发放共享锁,也不遵守排它锁。允许只读会导致更高的并发性,但会降低一致性。如果指定了 READUNCOMMITTED,就有可能读取未提交的事务,或读取在读取过程中回滚的一套页,因此可能出现错误信息。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
说明 如果在指定了 READUNCOMMITTED 的情况下收到 601 号错误信息,则按解决死锁错误 (1205) 的方法解决该错误,然后重试执行语句。
REPEATABLEREAD
指定用与运行在 REPEATABLE READ 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
ROWLOCK
指定在通常采取单个共享页或表锁的情形下采取共享行锁。
SERIALIZABLE
等同于 HOLDLOCK。通过将共享锁保持到事务完成,使之更具有约束性(而不要不管事务是否完成,都在不再需要所需的表或数据页时就立即释放共享锁)。用与运行在 SERIALIZABLE 隔离级别的事务相同的语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。
TABLOCK
指定在表上采取的共享锁一直保持到语句结束。如果同时指定 HOLDLOCK,那么在事务结束之前该共享表锁将一直保持。
TABLOCKX
指定在表上采取的排它锁一直保持到语句结束或事务结束。
UPDLOCK
指定读取表时采取更新锁而不是共享锁,且将这些更新锁保持到语句结束或事务结束。
XLOCK
指定应采取排它锁,且保持到由语句所处理的全部数据上的事务结束。如果与 PAGLOCK 或 TABLOCK 一同指定,则排它锁适用于适当的粒度级别。
View_hint:指定索引视图扫描。默认情况下,视图在查询优化器处理查询之前展开。
语法
< view_hint > ::=
{ NOEXPAND [ , INDEX ( index_val [ ,…n ] ) ] }
参数
NOEXPAND
指定当查询优化器处理查询时不扩展索引视图。查询优化器将视图作为具有聚集索引的表。
INDEX ( index_val [ ,…n ] )
指定 SQL Server 在处理语句时要使用的索引名称或 ID。只能为一个视图指定一个索引提示。
INDEX(0) 强制执行聚集索引扫描,而 INDEX(1) 强制执行聚集索引扫描或查找。
如果在单个提示列表中使用了多个索引,将忽略重复项,其余列出的索引将用于检索索引视图的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引的集合并不包含查询中所引用的全部列,则在检索全部索引列后执行一次提取操作。
锁定是由并发问题产生的,如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括:丢失或覆盖更新、未确认的相关性(脏读)、不一致的分析(非重复读)、幻像读。
可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级锁定提示的范围,以引导 Microsoft SQL Server 2000 使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。
SQL Server 查询优化器自动作出正确的决定。建议仅在必要时才使用表级锁定提示更改默认的锁定行为。禁止锁定级别反过来会影响并发。
例如,如果将事务隔离级别设置为 SERIALIZABLE,并且在 SELECT 语句中使用表级锁定提示 NOLOCK,则键范围锁通常用于维护不采用可串行事务。
USE pubs
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
SELECT au_lname FROM authors WITH (NOLOCK)
GO
生成的锁是:
EXEC sp_lock
GO
SELECT object_name(117575457)
GO
4.
问题:
上机时,有时会出现这样的问题:在diagrams窗口中添加表时,在窗口中看不到添加的表,甚至弹出出错窗口,提示错误信息:尚未调用Coinitialize
这是什么原因?如何解决?
答复:
我主意到你讲的是有时,说明和系统的稳定性有关,建议先排除操作系统和硬件,尤其是内存的可能性,再观察是否还存在所述现象
5.
问题:
SQL Server2000中的一个数据库中只允许有一个主数据文件,但在查询分析器中建立数据库时建立多个*.mdf文件时并不提示出错,然后打开企业管理器查看时,会列出多个*.mdf文件。为什么会这样呢?
答复:
理论上一个数据库包含一个.mdf多个.ndf和多个.ldf,您不妨把Create database的t-sql语句写出来,我们可以一同探讨。
据我所知,主文件与次要文件的区别不在于其扩展文件名,而在于创建数据库时的定义,微软用.MDF来表示主文件只是一种约定而已。实际上,不管主文件与次要文件,只要能区分就可以了。
主要数据文件不等于扩展名.mdf文件,教材阐述错误,准确地提法应是:主要数据文件推荐使用.mdf扩展名,次要数据推荐使用.ndf扩展名,但每个数据库确实有且仅有一个主要数据文件,这个数据文件你可命名为.mdf文件,也可命名为.ndf甚至.ldf文件,只要你不嫌烦。
同意第二和第三回复的解释,.mdf.ndf.ldf是微软推荐使用的扩展名,在使用create database语句创建数据库时按照默认的命名原则清晰易懂方便管理,这是一个普遍和特殊的问题,但在学生刚刚接触数据定义语言时还是按照常规做法为好,尤其是主数据文件和日志数据文件之间的关系和区别,避免混淆。
6.
问题:
我中心在SQL Server教学过程,遇到了如下问题:
有一句话“一个表中只能有一列定义有DEFAULT约束。”怎样理解,是否应该是‘一个表中只能定义一次DEFAULT约束在一个列中。’?可以给出英文原文吗?
答复:
您所述正确。
7.SQL索引中的一个问题
问题:
CREATE INDEX语句中,有一个可选项:IGNORE_DUP_KEY,意思是:选上该项的话,在唯一的聚集索引中,拒绝使用重复键插入或更新的行。如果是没有选上该项,则在重复键插入或更新行时,会弹出警告信息。二者的结果都是禁止重复键插入或更新,有没有本质上的区别或其他不同?
答复:
二者的区别在于出现重复键时,虽然最后结果都不能插入,但数据库呈现的行为不一样。如无此选项,则会“回滚”(结果是先插入再取消)插入并发出“错误”信息。有此选项,则会发出“警告”信息,且不允许插入(没有插入行为)。
8.关于IDENTITY属性的问题
问题:
关于已创建了表,然后向表中已有的列添加IDENTITY属性,此操作不可实现,因为列名已存在。如想实现向表中现有的列添加IDENTITY属性怎样实现?谢谢!
还有个问题请教,表中列名是否可以使用T-SQL语句修改。
答复:
对您所述问题的解决办法是:可把上述修改表的语句中的ADD关健字修改成ALTER COLUMN关键字即可。
可以通过下面的t-sql做到修改现有列为identity列:
第一步:
create table student
(
studid int not null,
firstname varchar(20) not null,
lastname varchar(20) not null
)
第二步:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_student
(
stduid int NOT NULL IDENTITY (1, 1),
firstname varchar(20) NOT NULL,
lastname varchar(20) NOT NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT dbo.Tmp_student ON
GO
IF EXISTS(SELECT * FROM dbo.student)
EXEC('INSERT INTO dbo.Tmp_student (stduid, firstname, lastname)
SELECT stduid, firstname, lastname FROM dbo.student TABLOCKX')
GO
SET IDENTITY_INSERT dbo.Tmp_student OFF
GO
DROP TABLE dbo.student
GO
EXECUTE sp_rename N'dbo.Tmp_student', N'student', 'OBJECT'
GO
COMMIT
9.关于用户定义的数据类型
问题:
用sp_addtype存储过程创建用户定义的数据类型时,其中的null_type的取值为NULL或NOT NULL。请问是什么意思?有什么作用?
答复:
用户自定义数据类型是基于系统数据类型集创建的,实际上是系统数据类型的别名而已。
为空性指用户自定义数据类型处理空值的方式。如果为空性未明确定义,系统将依据数据库或连接的 ANSI Null 默认设置进行指派。
10.
问题:
我中心在授课时有如下问题:
在SQL Serverr 内部测试中(机试一):
‘第三部分:3.创建一个UpadStartDt触发器,反映任何在cruise_book表和customer表中开始日期的更改。’
请问:在一个触发器上能反映出两个表的更改吗?是否此处有错误?
另外:第二部分:6.通过视图update_cruise修改cruise表的数据。这个update_cruise视图是新建的吗?
请问如何在视图上创建触发器?——是SQL Server新推出的功能吗?
答复:
您好,第一个问题可以这样设想,创建一个视图,包括cruise_book的开始日期和customer的开始日期。将UpadStartDt触发器创建在该视图的基础上可以实现。
视图是学生创建的
在视图上创建触发器确实是SQLServer2000的新增功能,在SQLServer7中不支持。
在SQLServer2000中的语法如下:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ …n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ …n ]
} ]
sql_statement [ …n ]
}
}
其中参数:
Table | view
是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
建议在目前的教材中不要采用上面的实现方式,还是创建触发器表来实现,可以创建两个触发器。
11.
问题:
select语句提供了各种解除数据锁定的方法,不知能否有例子说明一下。
Select 语句可以加锁,查询结束后,可以自动解锁,但如何解除已被别人加的锁定?
答复:
select语句可提供加锁的功能,如:select * from student where ID="001" holdlock。这是一个默认选项。但也可以解锁,如:select * from student where ID="001" unlock。但这样读出数据无法避免“脏读”(读取了未提交的数据)。可在“查询分析器”中打开帮助,搜索“锁定提示”。
12.关于sql server配置器
问题:
请教一个问题, SQLSERVER配置器是指什么?
答复:
要想打开SQLSERVER配置器,请运行“企业管理器”,然后用鼠标选中左边窗口目录中的服务器(图标是个绿色三角),点鼠标右键,从弹出菜单中选“属性”,即为SQLSERVER配置器。
是事件探查器 sql server Profiler
13.
问题:
如何取出电子邮件地址中之后的的值.
答复:
执行如下SQL语句即可:
select cust_nm,substring(e_mail,charindex('@',e_mail)+1,len(e_mail)-charindex('@',e_mail)) from customer
14.
问题:
1)在master数据库中以sp_开头的系统存储过程,那么其它的呢?比如以dt_开头的。
2)日期和时间参数设定后,我通过什么命令可以检查我对这两个参数的设置?
3)“ANSI”是指什么?是一种字符集标准?
答复:
1)dt_也是一种存储过程,但不是在master数据库中,而是在用户数据库中,如Northwind。Dt_存储过程(如dt_adduserobject)一般在用户创建数据库时由系统自动生成,主要用于处理用户数据库中系统自动生成的一些系统表(如dtproperties),起到实时维护系统环境的作用。
2)下例是关于系统日期格式、星期的第一天的设置及显示的例子:
set dateformat ydm /*设置日期输入格式为年日月*/
set datefirst 4 /*设置星期的第一天为星期四*/
select convert(char(50), datepart(dw,'2002-16-5')) from depart /*显示2002-16-5这一天是星期的第几天,from后面可为任一存在的表*/
3)ANSI是一种字符集标准,是美国国家标准字符集(American National Standards Institute),使用一个字节的长度表示256个字符。另外,美国信息交换用标准码 (ASCII)是7位字符集,广泛用于表示标准 U.S. 键盘上的字母和符号。ASCII 字符集与 ANSI 字符集中的前 128 个字符(0 到 127)相同。
15.
问题:
1)系统是依据什么准则将数据库对象(如表、存储过程等)放入主要文件或次要文件?
2)文件组的概念。它到底是如何优化系统性能的?
3)对“FOR LOAD”和“FOR ATTACH”的概念不太理解。
答复:
Microsoft® SQL Server™ 2000 使用一组操作系统文件映射数据库。数据库中的所有数据和对象(如表、存储过程、触发器和视图)都存储在下列操作系统文件中:
1)主要
该文件包含数据库的启动信息,并用于存储数据。每个数据库都有一个主要数据文件。
2)次要
这些文件含有不能置于主要数据文件中的所有数据。如果主文件可以包含数据库中的所有数据,那么数据库就不需要次要数据文件。有些数据库可能足够大故需要多个次要数据文件,或使用位于不同磁盘驱动器上的辅助文件将数据扩展到多个磁盘。
3)事务日志
这些文件包含用于恢复数据库的日志信息。每个数据库都必须至少有一个日志文件。
例如,创建简单的数据库 sales 时,可以只使用一个包含所有数据和对象的主文件和一个包含事务日志信息的日志文件。另一种情况是,创建更复杂的数据库 orders 时,可以使用一个主文件和五个辅助文件,数据库内的数据和对象扩展到所有的六个文件中,另外有四个日志文件包含事务日志信息。
允许对文件进行分组,以便于管理和数据的分配/放置。例如,可以分别在三个硬盘驱动器上创建三个文件(Data1.ndf、Data2.ndf 和 Data3.ndf),并将这三个文件指派到文件组 fgroup1 中。然后,可以明确地在文件组 fgroup1 上创建一个表。对表中数据的查询将分散到三个磁盘上,因而性能得以提高。在 RAID(独立磁盘冗余阵列)条带集上创建单个文件也可以获得相同的性能改善。然而,文件和文件组使您得以在新磁盘上轻易地添加新文件。另外,如果数据库超过单个 Microsoft Windows NT® 文件的最大大小,则可以使用次要数据文件允许数据库继续增长。
FOR LOAD在SQL SERVER6.5的create database命令中用于将已存在的数据库文件或备份的数据库恢复到系统中,而不是重新创建一个数据库。在SQL SERVER7.0以上的版本中,则往往通过restore命令来恢复一个数据库,很少用到FOR LOAD选项。保留该选项是为了和老版本兼容。
FOR ATTACH选项用于附加数据库,将现有的一些操作系统文件(从数据库中分离出来的数据库文件)附加到一个数据库中。附加的数据库必须使用与 SQL Server 相同的代码页和排序次序创建。否则,附加操作将失败。
下例使用for attach选项创建一个包含下列物理文件的名为 Archive 的数据库:
c:\program files\microsoft sql server\mssql\data\archdat1.mdf
c:\program files\microsoft sql server\mssql\data\archdat2.ndf
c:\program files\microsoft sql server\mssql\data\archdat3.ndf
c:\program files\microsoft sql server\mssql\data\archlog1.ldf
c:\program files\microsoft sql server\mssql\data\archlog2.ldf
可以使用 sp_detach_db 存储过程分离该数据库,然后使用带有 FOR ATTACH 子句的 CREATE DATABASE 重新附加。
Sp_detach_db Archive
GO
CREATE DATABASE Archive
ON PRIMARY (FILENAME = 'c:\program files\microsoft sql server\mssql\data\archdat1.mdf')
FOR ATTACH
GO
相关内容可查看SQL SERVER的联机帮助,有很详细的说明。