SQL Server数据库程序设计题库.docx
《SQL Server数据库程序设计题库.docx》由会员分享,可在线阅读,更多相关《SQL Server数据库程序设计题库.docx(35页珍藏版)》请在冰点文库上搜索。
SQLServer数据库程序设计题库
SQLServer2000数据库程序设计题库
1你是一个数据公司的数据库开发人员,你建立了一个用来存储了15个不同的高中体育成绩的统计数据库,50个体育信息公司将把这些信息发布在各自的Web站点上,每个公司站点的数据排列和使用这些统计数据的格式是不同的。
你要将数据打包传送给公司,你将怎么做?
a. 使用包含FORXML选项的SELECT语句提取数据。
b. 对SELECT语句返回的数据使用sp_makewebtask系统存储过程来生成HTML数据。
c. C.对数据库输出的数据建立数据转换服务包,形成使用TAB界定符的文本文件。
d. 建立一个使用SEL_DMO的应用程序来提取数据库中的数据,并将这些数据转换到标准EDI(electronicdatainterchange)文件。
答案:
A.
解释:
这些数据将会在公司的网站发布。
XML是可扩展标示语言,包含结构信息的文档。
可扩展标示语言适合制作WEB文件。
SQL查询结果可以是XML文档。
直接执行查询或存储过程也可以生成XML文档。
使用带FORXML的子句的SELECT语句可以直接生成XML文档。
在FORXML子句中XML的模式可以通过参数TRAW,AUTO,或EXPLICIT来指定.
不正确的答案:
B:
sp_makeweb储存程序用来生成HTML格式文档而不是的标准记录集。
XML是比HTML更复杂的格式的文档,在这种情形中XML更合适。
C:
一个用制表符分隔的文件,可以在任何支持用制表符分隔的文件的电子表格(如MicrosoftExcel)中进行分析。
然而,这个格式对网页是不适当的。
D:
SQL-DMO不能生成在网站分布的数据。
注意:
SQL-DMOSQL分布式管理对象(SQL-DMO)封装Microsoft®SQLServer™2000数据库中的对象。
SQL-DMO允许用支持自动化或COM的语言编写应用程序,以管理SQLServer安装的所有部分。
SQL-DMO是SQLServer2000中的SQLServer企业管理器所使用的应用程序接口(API);因此使用SQL-DMO的应用程序可以执行SQLServer企业管理器执行的所有功能。
SQL-DMO用于必须包含SQLServer管理的任何自动化或COM应用程序,例如:
封装SQLServer作为自己的数据存储并想尽量减少用户的SQLServer管理任务的应用程序。
在程序本身并入了专门的管理逻辑的应用程序。
想在自己的用户界面中集成SQLServer管理任务的应用程
2你是一个邮购公司的数据库开发人员,公司有两台使用SQLServer2000的计算机,分别为CORP1和CORP2。
CORP1是一台联机事务处理服务器,CORP2存储销售历史数据。
CORP2作为一台连接服务器已连接到CORP1上。
销售部经理要求你建立一个购买软盘的客户的列表,这个列表将每个月产生一次邮购的奖品,软盘在数据库中的类别ID为21。
你必须从SalesHistory表中刷新这个信息,这个文件存储在CORP2的一个数据库上,你要从CORP1上执行这个查询,你将使用哪条脚本语句查询?
A. EXECsp_addlinkedserver‘CORP2’,‘SQLServer’
GO
SELECTCustomerIDFROMCORP2.Archive.dbo.SalesHistory
WHERECategoryID=21
B. SELECTCustomerIDFROMOPENROWSET(‘SQLOLEDB’,‘CORP2’;‘p*word’,
‘SELECT CustomerIDFROMArchive.dbo.SalesHistoryWHERECategoryID=21’)
C.SELECTCustomerID FROM CORP2.Archive.dbo.SalesHistory WHERE CategoryID=21
D. EXECsp_addserver‘CORP2’
GO
SELECTCustomerIDFROMCORP2.Archive.dbo.SalesHistory
WHERECategoryID=21
答案:
C.
解释:
对于这种情况,只要一个简单的带WHERE子句SELECTFROM语句即可,一般格式:
SELECTCustomerIDFROMSalesHistory WHERECategoryID=21
但是SalesHistory表在另一台服务器上,并且已经建立了另一台服务器的连接,可以直接执行分布查询,必须使用对象的四部分名称:
服务器、数据库、所有者和表名,即CORP2.Archive.dbo.SalesHistory。
注:
sp_linkedserver
使用sp_linkedserver建立服务器连接,语法为:
sp_addlinkedserver[@server=]'server'
[,[@srvproduct=]'product_name']
[,[@provider=]'provider_name']
[,[@datasrc=]'data_source']
[,[@location=]'location']
[,[@provstr=]'provider_string']
[,[@catalog=]'catalog']
不正确答案:
A:
已建立服务器连接,不要再建立服务器连接
B:
对于已建立连接的服务器,一般不用OPENROWSET访问。
当访问链接服务器中的表时,OPENROWSET访问方法是一种替代方法,并且是一种使用OLEDB连接并访问远程数据的一次性的、特殊的方法。
D:
sp_addserver是一个非法存储过程名
3你是TreyResearch公司的一个数据库开发者。
你设计了两个事务用来输入职员的相关数据到公司的数据库中。
一个事务插入职员名字和地址到数据库中,这个事务很重要。
另一个事务插入职员人口统计的其他数据项,这个事务不很重要。
在访问高峰时,数据库管理人通知你数据库伺候器有时候会出现错误。
每当发生错误时,数据库伺候器随机地结束一个事务。
你一定保证当数据库伺候器结束一个事务时,它从不结束比较重要的事务。
你应该做什么?
A.重要事务的DEADLOCK_PRIORITY级别设置低
B.不重要事务的DEADLOCK_PRIORITY级别设置低
C.增加一段条件代码,检查重要事务的服务器返回的错误代号是否为1205,若是重新启动该事务
D.在事务的SQL操作语句中增加ROWLOCK优化提示
E.把重要事务的事务隔离级别设置为SERIALIZABLE
答案:
B
解释:
现在是一个死锁的问题,并且随机终止一个事务。
现在有两类事务:
重要事务和不重要事务
问题要求当死锁的问题发生时,要终止不重要事务而重要事务一定不要终止。
通过把不重要事务的DEADLOCK_PRIORITY级别设置低,当在两个事务间发生死锁时,不重要事务首先成为牺牲品,而重要事务没有被终止。
死锁:
当某组资源的两个或多个线程之间有循环相关性时,将发生死锁。
死锁是一种可能发生在任何多线程系统中的状态,而不仅仅发生在关系数据库管理系统中。
多线程系统中的一个线程可能获取一个或多个资源(如锁)。
如果正获取的资源当前为另一线程所拥有,则第一个线程可能必须等待拥有线程释放目标资源。
这时就说等待线程在那个特定资源上与拥有线程有相关性。
如果拥有线程需要获取另外一个资源,而该资源当前为等待线程所拥有,则这种情形将成为死锁:
在事务提交或回滚之前两个线程都不能释放资源,而且它们因为正等待对方拥有的资源而不能提交或回滚事务。
例如,运行事务1的线程T1具有Supplier表上的排它锁。
运行事务2的线程T2具有Part表上的排它锁,并且之后需要Supplier表上的锁。
事务2无法获得这一锁,因为事务1已拥有它。
事务2被阻塞,等待事务1。
然后,事务1需要Part表的锁,但无法获得锁,因为事务2将它锁定了。
事务在提交或回滚之前不能释放持有的锁。
因为事务需要对方控制的锁才能继续操作,所以它们不能提交或回滚。
说明 死锁经常与正常阻塞混淆。
当一个事务锁定了另一个事务需要的资源,第二个事务等待锁被释放。
默认情况下,SQLServer事务不会超时(除非设置了LOCK_TIMEOUT)。
第二个事务被阻塞,而不是被死锁。
在该插图中,对于Part表锁资源,线程T1在线程T2上具有相关性。
同样,对于Supplier表锁资源,线程T2在线程T1上具有相关性。
因为这些相关性形成了一个循环,所以在线程T1和线程T2之间存在死锁。
不正确答案:
A:
如果一个事务的优先级设置为低,当死锁发生时,它首先成为牺牲品;因为重要事务要保留,所以该事务的级别不能设置为低
C:
当一个事务的成为死锁的牺牲品时,服务器返回一个1205的错误代号;当重要事务杀死后,重启该事务,这样保证了该事务不会被终止,缺点是这个方法不是最有效的,并且会影响性能,最好为选择B
D:
ROWLOCK优化提示使用行级锁,而不使用粒度更粗的页级锁和表级锁
E:
事务准备接受不一致数据的级别称为隔离级别。
隔离级别是一个事务必须与其它事务进行隔离的程度。
较低的隔离级别可以增加并发,但代价是降低数据的正确性。
相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
应用程序要求的隔离级别确定了SQLServer使用的锁定行为。
注:
隔离级别
当锁定用作并发控制机制时,它可以解决并发问题。
这使所有事务得以在彼此完全隔离的环境中运行,但是任何时候都可以有多个正在运行的事务。
可串行性是通过运行一组并发事务达到的数据库状态,等同于这组事务按某种顺序连续执行时所达到的数据库状态。
SQL-92隔离级别
尽管可串行性对于事务确保数据库中的数据在所有时间内的正确性相当重要,然而许多事务并不总是要求完全的隔离。
例如,多个作者工作于同一本书的不同章节。
新章节可以在任意时候提交到项目中。
但是,对于已经编辑过的章节,没有编辑人员的批准,作者不能对此章节进行任何更改。
这样,尽管有未编辑的新章节,但编辑人员仍可以确保在任意时间该书籍项目的正确性。
编辑人员可以查看以前编辑的章节以及最近提交的章节。
事务准备接受不一致数据的级别称为隔离级别。
隔离级别是一个事务必须与其它事务进行隔离的程度。
较低的隔离级别可以增加并发,但代价是降低数据的正确性。
相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
应用程序要求的隔离级别确定了SQLServer使用的锁定行为。
SQL-92定义了下列四种隔离级别,SQLServer支持所有这些隔离级别:
未提交读(事务隔离的最低级别,仅可保证不读取物理损坏的数据)。
提交读(SQLServer默认级别)。
可重复读。
可串行读(事务隔离的最高级别,事务之间完全隔离)。
如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。
下面四种隔离级别允许不同类型的行为。
隔离级别
脏读
不可重复读取
幻像
未提交读
是
是
是
提交读
否
是
是
可重复读
否
否
是
可串行读
否
否
否
事务必须运行于可重复读或更高的隔离级别以防止丢失更新。
当两个事务检索相同的行,然后基于原检索的值对行进行更新时,会发生丢失更新。
如果两个事务使用一个UPDATE语句更新行,并且不基于以前检索的值进行更新,则在默认的提交读隔离级别不会发生丢失更新。
4 你是公司的SQLServer2000联机事务处理数据库的数据库开发人员。
许多表有一百万或更多的行,所有的表都建立了一个聚集索引,经常存取的表另外还至少有一个非聚集索引,数据库服务器上有两个RAID阵列存储数据文件,你想设置表和索引以取得最佳的I/O性能。
你在每个RAID阵列上建立了一个文件组,下一步你将作什么?
a.设置频繁的互相连接的表加入同一个文件组,设置经常存取的表和所有的属于这些表的索引到另一个文件组。
b.设置频繁的互相连接的表加入同一个文件组,设置经常存取的表和所有的属于这些表的非簇索引到不同的文件组。
c.设置频繁的互相连接的表加入不同的文件组,设置经常存取的表和所有的属于这些表的非簇索引到不同的文件组。
d.设置频繁的互相连接的表加入不同的文件组群,设置经常存取的表和所有的属于这些表的非簇索引到同一个文件组。
答案:
C.
解释:
把频繁访问的表和它的索引存放在不同磁盘阵列的文件组,可以提高数据库的性能。
因为这样可以使不同的线程来访问表和非聚集索引。
表和聚集索引不能分开存放到不同的文件组。
把经常连接的表分开存储到不同磁盘阵列也能提高数据库的性能。
另外,创建和磁盘阵列数一样多的文件个数,使得每个阵列上有一个文件,这样也能提高性能。
日志文件和数据文件分开存放到不同的磁盘阵列上也能提高性能。
不正确答案 :
A:
经常连接表存放到同一个文件组不能提高性能。
因为这样不能并行处理。
另外只有非聚集索引才能和表分别存储到不同文件组。
B:
经常连接表存放到同一个文件组不能提高性能。
因为这样不能并行处理
D:
把表和非聚集索引存放到同一个文件组不能提高性能。
因为这样不能并行处理
5你是公司的SQLServer2000数据库开发人员,你修改了数据库中用来建立销售部月报表的几个存储过程,存储过程中包含了从三个或更多表中提取数据的复杂查询,所有这些表都至少有一个索引。
用户报告说这些月报表比以前的版本的明显要慢,你要改进这些报表的性能,将怎么做?
a.对创建每个存储过程的DDL的脚本,使用这个脚本作为工作负载进行索引优化。
b.在SQLProfiler中捕捉每个存储过程的执行信息,使用这个信息文件作为工作负载进行索引优化。
c.修改存储过程中引用表的索引统计信息。
d.在SQL查询分析器中执行每个存储过程,使用ShowExecutionPlan选项。
e.在SQL查询分析器中执行每个存储过程,使用ShowServerTrace选项。
答案:
E.
解释:
通过查看服务器跟踪来分析和优化存储过程。
使用"显示服务器跟踪"选项,可以显示查询对服务器到底有何影响,通过这些信息,来分析和优化存储过程。
Note:
查询窗口跟踪窗格
"显示服务器跟踪"命令提供了对信息的访问,此信息用于确定查询对服务器方的影响。
如果"显示服务器跟踪"命令在执行查询时启用,则该命令显示跟踪窗格,此窗格提供有关事件类、子类、整型数据、文本数据、数据库ID、持续时间、启动时间、读、写以及CPU使用的信息。
索引优化向导
索引优化向导使您得以为Microsoft®SQLServer™2000数据库选择和创建优化的索引集和统计信息集,而不需要深入了解SQLServer的数据库结构、工作负荷或内部原理。
为了生成适用的优化索引集建议,该向导需要工作负荷。
工作负荷包含一个保存在文件或表中的SQL脚本或SQL事件探查器跟踪,其中有SQL批处理或远程过程调用(RPC)事件类以及EventClass和Text数据列。
Incorrectanswers:
A:
索引优化向导使用工作负载作为输入,存储过程的脚本不能作为其输入
SQL语言主要有两种:
一种是数据定义语言(DDL),用于定义和管理SQL数据库中的所有对象;另一种是数据操作语言(DML),用于选择、插入、更新和删除使用DDL定义的对象中的数据。
Transact-SQLDDL用于管理数据库、表和视图等对象,每个对象类通常都包含CREATE、ALTER和DROP语句,如CREATETABLE、ALTERTABLE和DROPTABLE。
DDL不能索引优化向导的输入
B:
索引优化可以提高存储过程的的性能,但是没有数据发生变化并且查询很复杂。
最好还是通过查看服务器跟踪来发现问题。
C:
选择合适的索引和工作负载是很复杂、耗时,对于中度复杂的数据库和负载也有可能出错。
若想优化索引,最好使用索引优化向导。
D:
执行计划能够提供一些线索,说明存储过程是怎样执行的。
一个执行计划只是说明对一个特殊的查询查询优化器是怎样优化的。
这些信息是有用的,它能用来优化查询的性能。
然而执行计划不是分析复杂查询的最好方法。
6你是一个国际进口商的数据库开发人员,你正在创建数据库,用来存储订购信息的,通过C/S模式的应用程序输入订购数据,每当输入一个新的定单,要分配唯一的一个定单号,定单号必须以递增的方式签发,平均每天有10000定单要输入。
你创建了一个Orders表,包含OrderNumber列,接下来你应怎么做?
A. 把该列的数据类型设为.uniqueidentifier
B. 把该列的数据类型设为INT,并设置具有IDENTITY属性
C. 把该列的数据类型设为INT,并创建一个用户函数,该函数返回表中的最大定单号
D. 把该列的数据类型设为INT,创建NextKey表,包含NextOrder(INT)列,再创建一个存储过程取出和更新NextKey表中的数据。
答案:
B.
解释:
对任何表都可创建包含系统所生成序号值的一个标识符列,该序号值唯一标识表中的一行。
例如,当在表中插入行时,标识符列可自动为应用程序产生唯一的客户收据号码。
标识符列在其所定义的表中包含的数值通常是唯一的。
这意味着在包含标识符列的其它表中可使用与之相同的数值进行标识。
一个表只能有一列定义为IDENTITY属性,而且该列必须以decimal、int、numeric、smallint、bigint或tinyint数据类型定义。
可指定种子和增量值。
二者的默认值均为1。
标识符列不允许空值,也不能包含DEFAULT定义或对象。
在设置DENTITY属性后,可以使用IDENTITYCOL关键字在选择表中引用该列。
不正确答案:
A:
MSSQLServer2000在复制表时使用uniqueidentifier数据类型,来保证列值的全球唯一性。
使用uniqueidentifier数据
uniqueidentifier数据类型存储16字节的二进制值,该值的使用与全局唯一标识符(GUID)一样。
GUID是一个唯一的二进制数字;世界上的任何两台计算机都不会生成重复的GUID值。
GUID主要用于在拥有多个节点、多台计算机的网络中,分配必须具有唯一性的标识符。
uniqueidentifier列的GUID值通常由以下方式获得:
∙在Transact-SQL语句、批处理或脚本中调用NEWID函数。
∙在应用程序代码中,调用返回GUID值的应用程序API函数或方法。
Transact-SQLNEWID函数以及应用程序API函数和方法从它们网卡上的标识数字以及CPU时钟的唯一数字生成新的uniqueidentifier值。
每个网卡都有唯一的标识号。
由NEWID返回的uniqueidentifier使用服务器上的网卡生成。
由应用程序API函数和方法返回的uniqueidentifier使用客户机上的网卡生成。
一般不将uniqueidentifier定义为常量,因为很难保证实际创建的uniqueidentifier具有唯一性。
指定uniqueidentifier常量的方法有两种:
字符串格式
'6F9619FF-8B86-D011-B42D-00C04FC964FF'二进制格式
0xff19966f868b11d0b42d00c04fc964ff可以使用NEWID()函数作为该字段的默认值
C:
函数是由一个或多个Transact-SQL语句组成的子程序,可用于封装代码以便重新使用。
Microsoft®SQLServer™2000并不将用户限制在定义为Transact-SQL语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用CREATEFUNCTION语句创建、使用ALTERFUNCTION语句修改、以及使用DROPFUNCTION语句除去用户定义函数。
每个完全合法的用户定义函数名(database_name.owner_name.function_name)必须唯一。
必须被授予CREATEFUNCTION权限才能创建、修改或除去用户定义函数。
不是所有者的用户在Transact-SQL语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。
若要创建或更改在CHECK约束、DEFAULT子句或计算列定义中引用用户定义函数的表,还必须具有函数的REFERENCES权限。
在函数中,区别处理导致删除语句并且继续在诸如触发器或存储过程等模式中的下一语句的Transact-SQL错误。
在函数中,上述错误会导致停止执行函数。
接下来该操作导致停止唤醒调用该函数的语句。
用户定义函数的类型
SQLServer2000支持三种用户定义函数:
∙标量函数
∙内嵌表值函数
∙多语句表值函数
D:
创建另外一个表用来跟踪定单号,在这个例子中是不合适的。
7你是一个技术培训中心的数据库开发人员,现在,行政人员在纸上记录有学生、教师、课程和教室的安排数据,培训中心想废除纸张管理而改用数据库来管理这些数据,你设计了下列表,
你想提高查询反映时间和冗余数据降到最小,应怎么办?
A. 创建Instructors表,包含InstructorID、InstructorName和OfficePhone列。
在Courses表中增加InstructorID列
B. 把Classroom表中的所有列移到Courses表中,删除Classroom表
C. 把Courses表中主键约束删除,而用CourseID和CourseTitle组合主键代替
D. 删除ClassroomID列,而建立ClassroomNumber和ClassTime主键约束。
答案:
A.
解释
标准化数据库是非常有效的,现在这个数据库的设计是非标准化的,Courses表中包含教师的数据,当一个教师有多余一门课时,就会有重复数据,InstructorName和OfficePhone要为每门课程登记。
这个数据库的标准化设计应该是:
创建一个新的表Instructors
该表中包含InstructorID,作为候选主键
在Instructors表中增加InstructorName和OfficePhone
删除Courses表中InstructorName和OfficePhone列,
在Courses表中增加Instruc