
CREATE CLUSTERED INDEX idx ON Customers(Name)
得到以下错误
Cannot create more than one clustered index
原因是什么,为什么为出错?
答:说明表上已经有了聚集索引,只能在同一张表上创建一个聚集索引。因为聚集索引会决定表的物理排列,由于只可能有一种排列方法,所以只能创建一个聚集索引。
5. 设有一个职员表为Customers,其上有客户姓(Last Name),名字(First Name)客户ID(ID)等列,先在LastName 和FirstName上创建一个称为idxNames的非聚集的复合索引,然后在客户ID上创建唯一的聚集索引uidxID,说明在创建聚集索引时非聚集索引会有什么变化
答: 创建聚集索引时非聚集索引将被重建,因为创建聚集索引将改变表中行的物理位置,而且在有聚集索引的表上的非聚集索引的B树的叶级存放的所有的鍵值和其对应的聚集索引的关键字,而之前的非聚集索引的B树的叶级存放的是所有的键值和其相对应的行ID。因此要进行非聚集索引的重建。
6. 如果顾客表没有索引,SQL Server如何为客户Eva Corets查找行?
答:SQL Server必须执行表扫描,读取表中的每一行来查找符合要求的行。
7. 一个表可以创建多少个聚集索引?
答: 一个。聚集索引定义数据页的物理存储并且表中的数据只能存储在一个位置。
8. 在表已经有聚集索引时,非聚集索引如何识别父行?在表没有聚集索引时,非聚集索引又如何识别数据行?
答:在聚集索引存在时,非聚集索引为每一个被索引的行存储聚集索引。在没有聚 集索引时,非聚集索引存储文件ID、页码和数据行的RID。
9. 不包括索引的字段的扩展会导致页拆分,页拆分将把行移动到新的页中。这种移动会对表中的非聚集索引产生什么样的影响?
答:这对非聚集索引没有影响。如果存储有聚集索引,聚集的值不会改变。非聚集索引将继续指向行,因为聚集索引关键字没有改变。如果没有聚集索引,在原记录的位置会留下一个转发指针指向新的记录。在任一情况下,非聚集索引不需要改变。
10. 考虑在表中的company name、last name和first name列上创建一个组合聚集索引。在创建索引时,什么是应该考虑的重点,为什么要考虑?还有更好的解决方法么?
答:尽可能保持聚集索引键尽量的小。大的聚集索引键会在所有的非聚集键上产生较大的影响。聚集索引越大,其效率越低。键值增加时,该值需要占有页上更多的空间,这样的页就只能容纳少量的键值,导致聚集索引树(B树)变得更大。聚集索引越大(它就会有更多的非叶级),那么需要遍历索引树的I/O周期越长。
同样的,唯一的组合键最好作为非聚集索引或多索引来定义。
可以考虑更好的解决方法是在customerID列(如果存在)或last name列上创建索引。如果customerID列并不存在,应该考虑使用标识属性或添加包括有通过在行中抽取数据的不同部分而衍生出来的键值的新列。
创建并维护索引
1. 假设你负责一家公司的数据库管理。用户向你抱怨查询据库Sales中的products表(表上建有idxProID索引)的速度太慢,你经过测试,发现可能是由于统计信息过时导致的。为了使将来不再发生这种问题,你要用哪个语句保证整个数据库的统计自动更新。
A DBCC SHOW_STATISTICS (products, idxProID)
B UPDATE STATISTICS ‘products’
C sp_autostats ‘products ‘,ON
D ALTER DATABASE Sales SET AUTO_CREATE_ STATISTICS ON
答:D
2. 已知数据库Sales中的products表上建有idxProID索引,你想知道这个索引是个聚集索引还是一个非聚集索引,可用以下哪个语句?(不定项选择)
A sp_helpindex products idxProID
B sp_help idxProID
C sp_help products
D USE Sales
GO
SELECT indid
FROM dbo. sysindexes
WHERE name = ‘idxProID’
答:C
3. 在你管理的数据库中有一张名为products的表,在监测products表的磁盘I/O的时候,你怀疑表的索引存在很多的碎片。已知products表在主键上有一个叫作idxProid的索引,另外还有nid1、nid2两个非聚集索引。你想使用耗费最小资源的办法重建products表上的索引,
应使用以下哪种方法。
A
DBCC DBREINDEX(products)
B
ALTER TABLE products DROP CONSTRAINT idxProid
ALTER TABLE ADD CONSTRAINT primary key idxProid(...)
C
CREATE INDEX idxProid ON products(...) WITH DROP_EXISTING
CREATE INDEX nid1 ON products(...) WITH DROP_EXISTING
CREATE INDEX nid2 ON products(...) WITH DROP_EXISTING
D
DROP INDEX products.idxProid
DROP INDEX products.nid1
DROP INDEX products.nid2
CREATE INDEX idxProid ON products(...)
CREATE INDEX nid1 ON products(...)
CREATE INDEX nid2 ON products(...)
答:A
4. 下面的一条SQL语句是用来创建一个索引的,试解释其作用。
CREATE UNIQUE CLUSTERED INDEX index1
ON table1(column1,column4 DESC)
WITH PAD_INDEX, FILLFACTO = 60, DROP EXISTING
答:该语句将在名为table1表上的column1和column4上建立一个组合的唯一聚集索引。另外column4上指定 DESC表示在该行上的排序次序为降序。另外在WITH中指定了FILLFACTO = 60这将使索引的页级只有60%被填满,还指定了PAD_INDEX这将使索引的非页级也只有60%被填满。最后WITH中还指定了DROP_EXISTING,这里如果原表中存在名为index1的索引,则它的特性将会上述语句所更改,使用这个选项的优点是我们不用删除一已存在的索引再重建它。
5. table1(存在于db1数据库上)上存在有一个index1索引,执行下列SQL语句
SELECT id, indid, reserved, used, origfillfactor, name
FROM db1.dbo.sysindexes
WHERE name = ‘index1’
返回
Id indid reserved used origfillfactor name
209452452 1 20 20 60 index1
(1 row(s) affected)
试说明SQL语句和返回的结果.
答: SQL语句在db1的系统索引表sysindexes查找名字为’index1’行的相关信息,也就是从系统索引表中找出索引index1的相关信息。 返回值中,id表示的是index1的ID值,indid为1表示该行是一个聚集索引的信息,reserved表示系统为索引分配的页面数,used表示该索引用的页面总数,origfillfactor表示索引创建时指定的FILLFACTO的值,默认为0,但在index1的创建中已指定了60,最后一列name表示索引名。
6. 你是负责管理大型客户数据库的数据库管理员。最近,当提交客户定单时,定单处理部门发现系统反映时间变慢。你的经验告诉你在Orders和Order Details表中的索引是正确的。是什么原因导致执行变慢了呢?
答:索引统计可能没有被自动地维护,因此,随着数据的修改它将越来越过时。FILLFACTOR选项需要被重新应用到为新的定单(行)分配的表和索引空间上,而新的定单是要插入到Orders和Order Details表中的。
7. SQL Server自动创建和更新统计信息有什么好处?
答:让查询优化器自动创建和更新统计表来可以减少管理负担并增加查询性能。
8. 你负责维护销售部门接受客户定单的数据库。销售数据库执行性能差。你的经理让你在两天内改善性能。解决这个问题的最恰当工具是什么?
答:用索引优化向导。第一天,创建一个工作负荷文件用于记录一整天的用户活动。在第二天,对工作负荷文件运行索引优化向导,查看索引分析并应用索引优化向导建议的索引。
实现视图
1. 你负责维护一个电信公司的数据库,不久前你在数据库上创建了一个视图vwOrders,并且在创建视图时使用了WITH SCHEMABINDING选项。现在你要修改这个vwOrders视图,增加一个WITH CHECK OPTION的选项。要求不能改动原有的选项,你要怎么做呢?(双项选择)
A 删除vwOrders,并用WITH SCHEMABINDING和WITH CHECK OPTION选
项重建视图
B 删除vwOrders,并用WITH CHECK OPTION选项重建视图
C 改变视图,并用WITH SCHEMABINDING和WITH CHECK OPTION选项
D 改变视图,并用WITH CHECK OPTION选项
答: AC
| 2. 你是公司的数据库管理员,有一天你要删除数据库中的一个视图 vwOrders(创建时没有使用WITH ENCRIPTION)时,系统提示存在其它视图依赖此视图,从而删除失败,你要怎么知道是哪个视图依赖这个视图呢?(不定项选择) A 通过查询系统表syscomments来得到视图的定义,从而得到依赖信息 B 使用sp_helptext ‘vwOrders’来得到视图的定义,从而得到依赖信息 C 使用 sp_depends ‘vwOrders’,来得到依赖信息 D 查询INFORMATION_SCHEMA.VIEW_TABLE_USAGE视图来得到依赖信息 答:C 3. 用下述语句创建视图 CREATE VIEW ProductsView AS SELECT ProductID, Price, Company FROM Supplier INNER JOIN Products ON Suppliers.ID = Products.SupplierID ORDER BY ProductID 出现错误,为什么,如何修改。 答: 因为在视图的创建中如果包含了ORDER BY子句,则要使用TOP语句才能生成视图。设我们要选出全部符合条件的记录,语句可改为如下: CREATE VIEW ProductsView AS SELECT TOP 100 PERCENT ProductID, Price, Company FROM Supplier INNER JOIN Products ON Suppliers.ID = Products.SupplierID ORDER BY ProductID 4. 在SQL Server上的Northwind数据库上创建这样一个叫作vwCustomerOrders的视图,视图中使用SELECT语句在以Orders表中的订单ID、Customers数据表中的公司名称(CompanyName)的和联系名称(ContactName),通过客户ID联接起来,并授于sales帐户在视图上的查询权限,写出创建视图,和授予权限的SQL语句,并说明sales帐户要具有在Orders和Customers表中的查询权限吗? 答:语句如下: USE Northwind GO CREATE VIEW vwCustomerOders AS SELECT o.OrderID, c.CompanyName, c.ContactName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID GO GRANT SELECT ON vwCustomerOders TO sales 另外,sale帐户不用具有Orders和Customers表中的查询权限,也可以对视图进行查询。 |
| 5. 视图的优点是什么? 答: 通过使用视图用户可以把注意力放在需要的数据上,也可以使用户对数据的操作变得简单。对用户来说,数据库和查询的复杂性被隐藏了,这样可以让用户看到更友好的名字。通过只允许用户访问视图中数据的这种方法,视图提供了一种安全机制。在视图上创建索引和通过视图分割数据可以优化性能。 6. 假设已经实现了联接Customer、Orders和Order Details表的查询,它列出了顾客订单的详细情况,例如物品的数量和要求的交货日期。在顾客改变现有的订单时,雇员需要更新Orders表和Order Details表。在不具有访问基表权限的情况下如何完成该任务? 答: 在查询上创建一个名为OrderDetailsView的视图。在视图上授权RequiredDate和Quantity列的更新权限。这样确保雇员只在Orders和Order Details表更新这些列。 7.在视图定义中使用WITH CHECK OPTION有什么益处? 答: 该选项强制视图上所有数据修改语句都要符合定义视图的SELECT中定义的准则。 8.在使用视图时应该考虑什么? 答:视图中引用的对象在创建视图时进行验证。为了使分配给视图的权限得到维护,可以修改视图。删除或修改基础表时会影响视图,如果视图的所有者不是dbo用户,用户的名字必须作为视图名字的一部分来指定。同一所有者必须拥有视图相关的所有对象以避免破坏所有权链。复杂性的隐藏会产生难以确定原因的性能问题。 |
| 实现存储过程 1. 创建一个名为FindCustomer存储过程,可以用它来找出SQL SERVER中的northwind数据库的Customer表中,CustomerID为指定值(输入参数)的记录的ContactName字段的名称,然后调用这个存储过程,找出CustomerID为’thecr’的ContactName字段值,写出创建存储过程的SQL语句和调用的命令,以下选项哪一个是正确的。 A 创建语句: USE northwind GO CREATE PROCEDURE dbo. FindCustomer $CustomerID char(5) LIKE SELECT contactName From Customers WHERE CustomerID=$CustomerID 调用语句 EXEC northwind.dbo. FindCustomer $CustomerID= ‘thecr’ B 创建语句: USE northwind GO CREATE PROCEDURE dbo. FindCustomer @CustomerID char(5) AS SELECT contactName From Customers WHERE @CustomerID=CustomerID 调用语句 EXEC northwind.dbo. FindCustomer @CustomerID= ‘thecr’
C 创建语句: USE northwind GO CREATE PROCEDURE dbo. FindCustomer @CustomerID char(5) AS SELECT contactName From Customers WHERE CustomerID=@CustomerID 调用语句 EXEC northwind.dbo. FindCustomer CustomerID= ‘thecr’
D 创建语句: USE northwind GO CREATE PROCEDURE dbo. FindCustomer @CustomerID char(5) LIKE SELECT contactName From Customers WHERE CustomerID=@CustomerID 调用语句 EXEC northwind.dbo. FindCustomer @CustomerID= ‘thecr’ 答: B |
A EXEC sp_helptext 'overdueOrders'
B EXEC sp_help overdueOrders
C EXEC sp_stored_procedures 'overdueOrders'
D EXEC sp_depends 'overdueOrders'
E 查询syscomments系统表
F 查询sysobjects系统表
答: AE
3. 创建一个名为FindCustomer1的存储过程,可以用它来找出SQL SERVER中的northwind数据库的Customer表中,CustomerID为指定值(输入参数)的记录的ContactName字段的名称,另外指定一个输出参数LineNum做为输出参数,还有必须在存储过程中判断CustomerID不能为空串,是的话要打印出出错信息,并返回错误值-1,如果查询成功在输出变量LineNum中保留选出的行数,然后返回值0。写出相应的SQL语句.
答:
USE NorthWind
GO
CREATE PROC FindCustomer3
@LineNum int OUTPUT,
@CustomerID char (5)
AS
IF LEN(@CustomerID)=0
BEGIN
PRINT 'You must supply a valid CustomerID'
RETURN -1
END
SELECT contactName
From Customers WHERE CustomerID=@CustomerID
SET @LineNum = @@ROWCOUNT
RETURN 0
| 4. 首先自定义一个错误号为50512的用户自定义错误,错误的严重级别为10,错误的文本消息为’Can’t find the customer ID. ’,另外消息中还要加上表名和输入的CustomerID, 并且当发生消息时将消息写入 Microsoft® Windows NT® 应用程序日志中。然后创建一个名为ExistCustomerID的存储过程,以用它来找出SQL SERVER中的northwind数据库的Customer表中,指定的CustomerID是否存在,如果存在返回0,如果不存在返回错误号50512,并将消息写入 Microsoft® Windows NT® 应用程序日志中。写出定义错误消息和创建存储过程的语句。 答: 定义自定义错误消息 EXEC sp_addmessage @msgnum = 50512, @severity = 10, @msgtext = 'Can’t find the customer ID:%s at table %s.', @with_log ='true' 创建存储过程的语句如下 USE NorthWind GO CREATE PROC ExistCustomerID @CustomerID char (5) AS SELECT CustomerID From Customers WHERE CustomerID=@CustomerID IF @@ROWCOUNT=0 BEGIN RAISEERROR(50512, 10, 1, @ CustomerID, @DBNAME) RETURN END RETURN 0 |
| 5. 已经创建了一个从数据库中删除客户的存储过程。在删除事务完成时,希望有一个自定义的错误信息写入Windows 2000应用程序日志。如何执行该任务? 答: 通过在sp_addmessage存储过程中指定@with_log参数创建一个自定义的错误信息。删除事务提交后,在存储过程中调用RAISERROR语句来生成自定义的错误信息。 6. 希望工资管理部门的用户可以在payroll数据库中插入、更新和删除数据。然而,不希望他们有访问基表的权限。那么除了创建一个视图以外,还能如何实现该目标? 答: 创建实现单一任务的存储过程。在存储过程中给工资管理部门的用户授予EXECUTE的权限。 7. 在数据库中必须修改一个存储过程,而有几个用户已被授予了执行该存储过程的权限。执行哪个语句来完成修改而又不影响现有的权限? 答: ALTER PROC。如果执行DROP PROC和CREATE PROC语句来实现想要的修改,必须再次授予用户EXECUTE权限。 实现用户定义函数 1. 你是某大型商场的数据库开发人员,要实现对商品的销售情况的复杂统计。这个统计每次根据用户提供的一个商品代号,访问一些表中的数据进行统计,最后返回一个值。你要在SELECT、UPDATE和DELETE语句中使用这个计算的结果。哪种实现方法最有效? A. 内嵌表值用户定义函数 B. 存储过程 C. 视图 D. 标量用户定义函数 答: D 2. 什么时候使用内嵌表值函数来代替视图比较好? 答: 当视图不能静态确定,需要参数的时候。 3. 在学生信息管理系统中,学生信息表包含列“学号”、列“姓名”;课程信息表包含列“课程代号”、“课程名称”;学生成绩表包含列“学号”、列“课程代号”、列“成绩”,已用约束保证成绩的范围为0~100分。编写内嵌表值函数,每次输入一个学号,返回学生学习的课程的名称和分数。 答: CREATE FUNCTION fn_RetrieveOneStudent (@学号 varchar(8)) RETURNS TABLE AS RETURN ( SELECT 课程名称,成绩 FROM 学生信息表 AS a INNER JOIN 学生成绩表 AS b ON a.学号=b.学号 INNER JOIN 课程信息表 AS c ON b.课程代号=c.课程代号 WHERE a.学号=@学号 ) |
答:
CREATE FUNCTION fn_EvaluateOneStudent
(@学号 char(8))
RETURNS varchar(10)
AS
BEGIN
DECLARE @平均分 integer, @等级 varchar(10)
SELECT @平均分=AVG(成绩)FROM 学生成绩表 WHERE 学号=@学号
IF @平均分 BETWEEN 85 AND 100
SET @等级='优'
ELSE
IF @平均分 BETWEEN 75 AND 84
SET @等级='良'
ELSE IF @平均分 BETWEEN 65 AND 74
SET @等级='中'
ELSE IF @平均分 BETWEEN 0 AND
SET @等级='差'
RETURN @等级
END
| 5. 描述用户定义函数的三种类型的。 答:标量函数类似于内置函数; 多语句表值函数类似于存储过程; 内嵌表值函数类似于视图。 6.什么样的内置函数不允许出现在用户定义函数的函数体内? 答:不能使用非确定性函数,比如GETDATE()。 7.什么类型的用户定义函数需要指明输出列的名称和数据类型? 答:标量和多语句用户定义函数要求完整的列描述,包括列名和数据类型定义。内嵌表值函数使用输出列的列名和隐含的数据类型。 实现触发器 1. AFTER触发器和INSTEAD OF触发器有什么区别? 答: AFTER触发器在插入、删除或者更新语句执行后才激活,而且不能在视图或临时表上创建AFTER触发器。INSTEAD OF在插入、删除或者更新语句执行前激活,而且可以用在视图或临时表上。 2. 请写出SQL语句,禁止表Employees中所有的触发器。 答: ALTER TABLE Employees DISABLE TRIGGER ALL 3. 你负责开发了一个酒店管理系统。在设计系统时考虑到每年的住宿客人很多,所以在客人结账后就把该客人的所有信息从数据库中删除,不然的话几年后数据量会很大,数据库的访问就会变得很慢,而且编程也比较麻烦,要区分哪些是现有客人的信息和哪些是已经结帐的客人的信息。系统运行一段时间后,酒店管理人员要求保存已经结帐的客人的信息,但是你不想改动已经编写好的应用程序。如何才能比较轻松地完成酒店管理人员的要求。 答: 对每个用于保存客人信息的表,创建一个相同或相似的表(表的名称要不同),用于记录已经结账的客人的信息。然后在用于记录未结帐客人的信息的表上创建DELETE触发器。当客人结帐后在删除客人的信息时,这些DELETE触发器被激活,可在这时把客人的信息插入到新创建的对应的表上。 |
答:
CREATE TRIGGER Purchase_Insert ON 购买表
FOR INSERT
AS
BEGIN
IF (SELECT count(*) FROM Inserted) <> 1
BEGIN
RAISERROR(‘一次购买只允许插入一个记录!’,16, 1)
ROLLBACK TRANSACTION
RETURN
END
IF ( SELECT a.现有预算金额-b.购买金额
FROM 预算表 AS a INNER JOIN
Inserted AS b ON a.经理代号=b.经理代号)<0
BEGIN
RAISERROR(‘现有预算金额不足支付购买金额 !’,16, 1)
ROLLBACK TRANSACTION
RETURN
END
UPDATE 预算表
SET 现有预算金额 = a.现有预算金额 – b.购买金额
FROM 预算表 AS a INNER JOIN
Inserted AS b ON a.经理代号=b.经理代号
END
5. 如果存货清单管理器在INSERT语句中不提供 Products.ProductID 列的值,那么在列 的定义中必须包含什么特征?
答:列值允许空值,如果其不允许为空值,则它必须包含一个缺省值。
6. 如果在Products 表中的ProductID列上存在一个主键约束,触发器是否能工作?为什么?
答:触发器不能工作。在修改(插入)数据前,已经进行了约束检查。一个主键约束不能为空值,因此INSERT插入语句将失败。
7. 要使一个触发器进行工作,必须要做的是什么?
答:使用一个缺省值,它放入一个临时ProductID号作为占位符,然后让触发器分配正确的值。临时ProductID号必须是ProductID号可能范围之外的一个值。例如,9999999是一个好的选择,因为存货清单中的产品数不能多于9999999个。
另一种方法是删除主键约束。需要创建另外一个触发器来替换它,保持和检查ProductID 列的引用完整性。在ProductID 列上还必须创建一个惟一索引。
多服务器编程
1. 添加一个Access的链接服务器,名为ACCESS_DB, Access的数据库文件位置在系统C:\\DB目录下的tv.mdb,写出相应的命令(OLE DB的提供者使用Microsoft.Jet.OLEDB.4.0)。选择正确答案。
A
EXEC sp_addlinkedserver
server=’ ACCESS_DB’,
srvproduct = ‘Access’,
provider=’ Microsoft.Jet.OLEDB.4.0’,
datasrc=’C:\\DB\v.mdb’
B
EXEC sp_addlinkedserver
@server=’ ACCESS_DB’,
@srvproduct = ‘Access’,
@provider=’ Microsoft.Jet.OLEDB.4.0’,
@database=’C:\\DB\v.mdb’
C
EXEC sp_addlinkedserver
server=’ ACCESS_DB’,
srvproduct = ‘Access’,
provider=’ Microsoft.Jet.OLEDB.4.0’,
database=’C:\\DB\v.mdb’
D
EXEC sp_addlinkedserver
@server=’ ACCESS_DB’,
@srvproduct = ‘Access’,
@provider=’ Microsoft.Jet.OLEDB.4.0’,
@datasrc=’C:\\DB\v.mdb’
答: D
| 2. 将本地的所有用户连接到一个叫做ORACLE_DB的链接服务器时,都映射为一个叫做oracle_user的帐号,密码是1234,从选项中找出正确的答案。 A EXEC sp_addlogin @rmtsrvname = ‘ORACLE_DB’, @useself = ‘true’, @rmtuser=’ oracle_user’, @rmtpassword = ‘1234’ B EXEC sp_addlinkedsrvlogin @rmtsrvname = ‘ORACLE_DB’, @useself = ‘true’, @rmtuser=’ oracle_user’, @rmtpassword = ‘1234’ C EXEC sp_addlinkedsrvlogin @rmtsrvname = ‘ORACLE_DB’, @useself = ‘false’, @rmtuser=’ oracle_user’, @rmtpassword = ‘1234’ D EXEC sp_addlogin @rmtsrvname = ‘ORACLE_DB’, @useself = ‘false’, @rmtuser=’ oracle_user’, @rmtpassword = ‘1234’ 答: C |
| 3. 从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择CustomerID相同的所有列,假设Access Northwind 数据库位于c:\\Access\\northwind.mdb,使用帐户admin,密码1234来访问Acess数据,另外使用‘Microsoft.Jet.OLEDB.4.0’做为OLE DB提供者,写出相应命令。 答:在本地 SQL Server Northwind 数据库中执行 SELECT c.*, o.* FROM Northwind.dbo.Customers AS c INNER JOIN OPENROWSET(‘Microsoft.Jet.OLEDB.4.0’, ‘c:\\Access\\northwind.mdb’;’admin’;’1234’, Orders) AS o ON c.CustomerID = o.CustomerID GO 4. 执行以下一个分布事务,将本地pubs数据库上的authors表中au_id 为 '409-56-7008,的au_lname列设为值'McDonald',同时执行名为remote的链接服务器上的相应数据库中的changeauth_lname存储过程(所有者为dbo),来执行相同的更改,changeauth_lname存储过程带两个参数:第一个是要修改列的au_id的值,第二个参数是要更改的au_lname的值.写出相应命令。 答: USE pubs GO SET XACT_ABORT ON BEGIN DISTRIBUTED TRANSACTION UPDATE authors SET au_lname = 'McDonald' WHERE au_id = '409-56-7008' EXEC remote.pubs.dbo.changeauth_lname '409-56-7008','McDonald' COMMIT TRAN GO |
| 5. 你拥有一家经营邮购业务的企业,它有两个仓库,一个仓库位于美国,另一个位于亚洲。每个仓库都有SQL Server,其中存储了库存数据库的本地副本。这两台名为USsales和Asiasales的服务器通过广域网(WAN)相互连接。你的企业要求这两个数据库必须始终保存最新数据并相互同步。 a) 应使用哪种数据分布方法将一台服务器上的更改传播到另一台服务器? 答:由于严格的一致性要求,应该使用分布式事务处理来更新两个数据库。不要使用复制,因为这两个数据库必须始终保持同步。 b) 你的办公室在美国。你每天早晨都生成一个报表,用来显示在每个仓库中销售量最高的十项商品的库存量。你会如何产生这个报表? 答:你应该在USsales计算机上注册Asiasales服务器作为链接服务器,然后在USsales服务器上编写并执行查询,该查询使用具有四部分的全修饰名来访问链接服务器的信息。 c) 由于经常在仓库之间转移库存商品,所以必须同时更新两地的数据库,以保证库存数量总是最新的。你会如何做到这一点? 答:可以编写分布式查询或者存储过程来在每个数据库上增加或减少存货总量。然后编写查询,在这个查询的BEGIN DISTRIBUTED TRANSACTION和COMMIT TRANSACTION块中装入分布式查询,或者调用存储过程。使用分布式事务处理确保数据库的同步性。 d) 服务器Asiasales还拥有一个包含销售摘要信息的Microsoft Access数据库。有时候,你想访问该摘要数据来产生一个报表,该报表包含USsales库存数据库中的数据。如何在报表中将来自两个数据源的数据组合起来? 答:可以编写使用OPENROWSET函数访问Access数据库中数据的查询。要产生报表,则要将Access数据库中的表和本地SQL Server数据库中的表联接起来。 优化查询性能 1. 找出下列子句中,为SARG的子句。 A ABS(num)<4 B name LIKE ‘%Sprite’ C name = ‘jone%’ OR customerID > 20000 D name = ‘jone%’ AND customerID > 20000 答:D |
