1、写一个触发器,一个存储过程、一个函数、一个表,一个视图 的创建代码。
题目内容:考你T-SQL知识
答题要求:贴出代码。2、求从今天往后数的7000天,所在日期的当月有多少天。 题目内容:考你T-SQL及函数知识
答题要求:贴出代码。3、写几个表,能够表明完整表达学生选择课程的意思。
字段不要太多,我要你表明它们的关系怎么建立的。 题目内容:考你范式设计
答题要求:贴出完整关系图标准答案 1.1创建一个table:
create table firm(
firm_id int identity(1000,1) primary key,
firm_name varchar(50) not null,
firm_introduce varchar(255) null
)on[primary] 1.2创建一个procedure
create proc strconnect
@str1 varchar(30),@str2 varchar(30),@connect varchar(60) output
as
set @connect=@str1+@str2
1.3创建一个view
create view firm_view
as
select firm_id,firm_name from firm 1.4创建一个function
create function compute_sum
(@price money,@quantity int)
return money
as
begin
declare @p_sum money
set @p_sum=@price*@quantity
return(@p_sum)
end 1.5创建一个触发器
/*我这个触发器建得很漏哦~~*/
create trigger firm_trigger
on firm
for insert,update
as
begin
declare @firm_fund int
select @firm_fund=firm_fund from firm
if @firm_fund>=1000000
begin
update firm set firm_ /> end
if @firm_fund<1000000
begin
update firm set firm_ /> end
end 2、declare @date_time datetime,@day_num int,@d int
set @date_time=dateadd(d,7000,getdate())
set @d=month(@date_time)
if @d=12
set @day_num=31
else set @day_num=day(dateadd(d,-1,(cast(year(@date_time) as varchar(4))+'-'+cast((month(@date_time)+1) as varchar(2))+'-01')) ) select @day_num,@d as dd,@date_time本题目专门考数据库管理知识 1、创建一个数据库 AAA
答题要求:T-SQL实现 2、完全备份数据库AAA到磁盘文件c:/AAA.bak 答题要求:T-SQL实现 3、删除数据库AAA 答题要求:T-SQL实现
4、从磁盘文件C:/AAA.bak中还原数据库为BBB 答题要求:T-SQL实现 5、将数据库BBB的物理文件移动到另外一个目录。(假设原来在系统的默认目录,现在让你移动到c:/下面)
答题要求:语言描述。当然,能用T-SQL实现最好。标准答案 1、Create Database AAA
2、backup database aaa to disk='c:/aaa.bak' 就好了!3、drop database aaa4、Restore database BBB From disk='c:/aaa.bak'另外注:如果没有3,也就是没有删除AAA数据库。那算我出题超题,没有考虑到逻辑文件名:),所以难度太大了。大概这样写:(我没有测试。)RESTORE DATABASE bbb
FROM DISK = 'c:/aaa.bak'
WITH move 'aaa' to 'd:/bbb.mdf',
move 'aaa_Log' to 'd:/bbb_Log.ldf'其中,aaa,aaa_log是逻辑文件名。 如何获得逻辑文件名可以用Restore FileListOnly From Disk='c:/aaa.bak' 获得。呵呵,具体我就不编程了,算是我超题。5、
第一步:分离数据库(exec sp_detach_db 'bbb','true');
第二步:将数据库文件移到c:/下面;
第三步:通过指定移动文件的新位置附加数据库:
exec sp_attach_db 'bbb','c:/bbb_data.mdf',
'c:/bbb_log.ldf'
本题目专门考存储过程知识和TSQL知识!!测试2的题目太浅了,这次要深一点!!:(:( 1、创建一个通用存储过程,要求备份任意数据库到任意磁盘文件的功能。即有两个参数,一个是数据库的名字,一个是备份的文件名字。执行如:
Exec spBackupDB 'myDatabase','c:/myDatabase.Bak'实现备份。 答题要求:T-SQL实现
注意要点:不允许写死是某一个数据库,也不允许写死是某一个文件!!
提示: Execute , sp_ExecuteSQL 2、现有环境: Student表 结构如下:
Create Table Student(
StudID int not null primary key, --学号
Name varchar(20), --姓名
Sex bit Not null --性别,1表示男,0表示女
) 数据如下:
StudID Name Sex
----------------------------------------------------------------
1 Chair3 1
2 CGF 0
3 xwj 0 要求写一段更新代码,自动给客户删除StudID=1的数据,并增加一条新的数据,数据为:
StudID Name Sex
----------------------------------------------------------------
4 西方不敢很帅 1
考虑到用户的可能误操作,因此要求在程序中进行一定的判断,避免异常!
答题要求:T-SQL实现
提示:注意判断 3、给上一条题目2的Student表进行修改,修改结构为: Create Table Student(
StudID int not null primary key, --学号
Name varchar(20), --姓名
Sex bit Not null, --性别,1表示男,0表示女
Chinese Float Not Null Default 0 --语文的分数
) 也是给客户更新的。注意不要破坏客户原有的数据!! 答题要求:T-SQL实现
提示: sysColumns, Object_ID() 标准答案 修改自 文洁。呵呵,我发现我的几个学生,有时候一些技巧比我做的好。
比如第一题,我就一开始认定是要使用动态SQL的(拍拍前额,老了…)-------------------------
老师的意思这样就可以了?1、create proc stu_back2
@dbname nvarchar(100),
@dbbuckup nvarchar (500)asBACKUP DATABASE @dbname TO disk=@dbbuckup后面2道(今天看到第3题的提示:做了一些修改,第一次没有用if判断)2
if not exists (select studid from student where StudID=4)
begin
delete from student where StudID=1
insert into student values(4,'西方不敢很帅',1)
end3
if exists (select name,id from syscolumns where name='Chinese'and id=OBJECT_ID('test..student'))
print 'this is exists'
else
alter table student
add Chinese Float Not Null
DEFAULT 0 WITH valueS
呵呵,以前记得有个写通讯的朋友很看不起数据库,说,不就是那几条语句么?我当时冷冷的说:就一条Select ,我就可以让你足足学够一个星期!!本次专题:Select ,再Select,然后还是Select !! 环境一:
表结构: Create Table Student(
ClassID int Not Null, --班级编码
StudID int not null primary key, --学号
Name varchar(20), --姓名
Sex bit Not null --性别,1表示男,0表示女
Chinese Float Not Null Default 0 --语文的分数
) 数据:
ClassID StudID Name Sex Chinese
----------------------------------------------------------------
2 1 Chair3 1 77
1 2 CGF 0 88
2 3 xwj 0 78
3 4 西方不敢很帅 1 55.9
2 5 Saten 1 77
3 6 歪书生 1 66.7
0.(环境一)求姓“歪”的男生的资料。
答题要求:SQL实现 1.(环境一)求学号前面3位学生 答题要求:SQL实现(注意,不是T-SQL阿!以下同)2.(环境一)求所有学生中,男生与女生的数量。
答题要求:SQL实现
3.(环境一)求各班的语文分数。
答题要求:SQL实现4.(环境一)生成一个相同结构的Student2表,同时把这个表的数据复制过去。
答题要求:SQL实现5.(环境一)求男生最多的一个班级
答题要求:SQL实现6.(环境一)显示所有的数据,Sex=1显示为“男”,Sex=0显示为“女” 答题要求:SQL实现7.(环境一)求取语文前5名的学生。 答题要求:T-SQL实现 其他说明:
在学校排名中,如果a,b的分数相同,那么,他们是同一个名次的,比他们稍低分数的c则要跳过一个名次。
也就是,我要得到这个结果: ClassID StudID Name Sex Chinese ChineseOrder
-----------------------------------------------------------------------------------
1 2 CGF 0 88 1
2 3 xwj 0 78 2
2 1 Chair3 1 77 3
2 5 Saten 1 77 3
3 6 歪书生 1 66.7 5 提示:临时表,Indentity。 这题有一定的难度。可能我又要超题了……:)不过,这可是非常现实的题目。
标准答案 0.(环境一)求姓“歪”的男生的资料。
select * from student where left(name,1) ='歪' and sex=11.(环境一)求学号前面3位学生
select top 3 * from student order by studid2.(环境一)求所有学生中,男生与女生的数量。
select sex,count(*) as num from student group by sex
3.(环境一)求各班的语文分数。
select classid,sum(chinese) as 总分, avg(chinese) as 平均分 from student group by classid
4.(环境一)生成一个相同结构的student2表,同时把这个表的数据复制过去。
/*请教过别人,才知道做的:$ ,原来不知道select into用法*/
select * into student2 from student5.(环境一)求男生最多的一个班级
select top 1 classid from student where sex=1 group by classid order by count(*) desc6.(环境一)显示所有的数据,sex=1显示为“男”,sex=0显示为“女”
/*请教过别人,才知道做的:$ */
select classid,studid,name ,case when sex=1 then '男' else '女' end as sex ,chinese from student 7、
select *,isnull((select sum(1) from student
where chinese>e.chinese),0)+1 as chineseorder from student e where isnull((select sum(1) from student
where chinese>e.chinese),0)+1<=5 order by chinese desc
环境一:
Student表结构: Create Table Student(
ClassID int Not Null, --班级编码
StudID int not null primary key, --学号
Name varchar(20), --姓名
Sex bit Not null, --性别,1表示男,0表示女
Chinese Float Not Null Default 0 --语文的分数
) 数据:
ClassID StudID Name Sex Chinese
----------------------------------------------------------------
2 1 Chair3 1 77
1 2 CGF 0 88
2 3 xwj 0 78
3 4 西方不敢很帅 1 55.9
2 5 Saten 1 77
3 6 歪书生 1 66.7 ------------
Class表结构:
Create Table Class(
ClassID Int Not Null Primary key,
SchoolID int not null,
ClassName varchar(30)
) 数据:
ClassID SchoolID ClassName
--------------------------------------------
1 1 952班
2 2 953班
3 2 955班
4 1 995班
5 1 921班
6 3 953班 -------------
School表结构:
Create Table School(
SchoolID int not null primary key,
School varchar(50)
) 数据:
SchoolID School
--------------------------------------
1 北京2中
2 北京3中
3 上海1中
4 上海2中 --------------- 他们的关系: School <-- Class (SchoolID,级联) (以后提到级联,若非特别指出,均指级联更新与级联删除)
Class <-- Student (ClassID,级联) 0.(环境一)显示学生表中所有的数据,并同时显示他们的学校以及班级名称 答题要求:SQL实现
1.(环境一)求各个学校的男女学生人数及小计人数(各个学校总人数)、总计人数(所有人数)
答题要求:SQL实现
提示:WITH 子句。With CUBE | ROLLUP 2.(环境一)删除“上海2中”的所有数据,包括学校、班级、学生数据。
答题要求:SQL实现
3.(环境一)假设题目中的级联,仅仅指级联更新,那么,2题又该怎么实现?要求使用同一事务。
答题要求:TSQL实现
提示:Trans4.(环境一)创建一条唯一索引在School.School中。不允许学校名相同。 答题要求:TSQL实现标准答案 0.显示学生表中所有的数据,并同时显示他们的学校以及班级名称
select student.*,school,classname
from school inner join class on school.schoolid = class.schoolid
inner join student on class.classid = student.classid 1.求各个学校的男女学生人数及小计人数(各个学校总人数)、总计人数(所有人数)
select case when (grouping(school) = 1) then 'all'
else isnull(school, 'unknown')
end as school,
case sex when 1 then '男' when 0 then '女' else 'all'
end as sex ,
count(sex) as sumnum
from school inner join class on school.schoolid = class.schoolid
inner join student on class.classid = student.classid
group by school,sex with rollup2.删除“上海2中”的所有数据,包括学校、班级、学生数据。
delete from school where school='上海2中'3..(环境一)假设题目中的级联,仅仅指级联更新,那么,2题又该怎么实现?要求使用同一事务
begin transaction t1
delete from student where classid in (select classid
from class where schoolid in (select schoolid
from school where school='上海2中'))
if @@error<>0
goto err
delete from class where schoolid in (select schoolid
from school where school='上海2中')
if @@error<>0
goto err
delete from school where school='上海2中'
if @@error<>0
goto err
commit transaction t1
err:
rollback transaction t14.创建一条唯一索引在school.school中。不允许学校名相同。
create unique clustered index school_ind
on school(school)
with ignore_dup_key
1、设计类似Windows NT的用户权限结构。要求有几个方面:
A.用户组 B.用户 C.用户操作记录 D.权限(允许查询,允许编辑,允许管理) 答题要求: 贴出关系图。(字段不要很多,能够表达意思就可以。请文字注明字段的含义。) 2、设计一个无限分级的雇员关系图(类似Dev-Club的论坛树形结构) 答题要求:贴出关系图。 3、设计一个大学里面的管理系统。要求有几个方面
A.学院 B.专业 C.班级 D.学生 E.课程 就这几个方面,请根据一般大学里面的实际情况设计。能够完全表达相应的意思。 答题要求:贴出关系图。 本题无标准答案:),实际上要根据具体情况来设计的。 范式采用与否以及采用深度都要根据情况。本次训练专题:动态SQL。总提示只有两个:sp_ExecuteSQL,Execute 1、写一个存储过程,可以清空任意一个表的数据。 答题要求:贴出代码。2、写一个存储过程,该存储过程可以对任意一个数据库(假设该数据库中不存在任何关系)进行数据清空。 答题要求: 贴出代码 3、写一个存储过程,要求这个存储过程返回某一个表的记录数量。 答题要求:帖出代码(不允许用数据集返回) 4、写一个存储过程,要求这个存储过程返回某一个表的某一个字段排序下第X条记录的ID值(注:假设该表存在一个整型ID字段,唯一标识)。 答题要求:贴出代码 (不允许用数据集返回)大概都测试过,还有什么不对的地方请老师指点。目前就是还有第2题含有不解之处。我对第2题大概注明一下,请老师看看。 1、写一个存储过程,可以清空任意一个表的数据。
create proc trun_table
@tb_name varchar(50)
as
exec ('truncate table ' +' '+@tb_name)
GO
2、写一个存储过程,该存储过程可以对任意一个数据库(假设该数据库中不存在任何关系)进行数据清空。create proc deldbdata
@dbname varchar(50)--定义一变量,来传递所要清空数据库名。
as
declare @tbname varchar(50)--定义来传递所要清空数据库中的用户表表名的变量
declare @id int --定义来传递临时表中自增长字段的变量
declare @sql varchar(2000)
create table #tep(id INT IDENTITY(1,1) PRIMARY KEY,t_name varchar(50))--创建一个带有自增长字段和存取要清空数据库中用户表表名的字段。
set @sql='insert into #tep select name from '+@dbname+'..sysobjects where xtype=''U'' and name<>''dtproperties'''
exec (@sql) --把数据库中用户表表名插入临时表。
while(exists(select * from #tep)) /* 这部分代码作用就是先判断临时 begin 表中是否还有纪录,有就每次取1 select top 1 @id=id,@tbname=t_name from #tep 条id号和表名,之后对该库和该表进行
exec('delete from '+@dbname+'..'+@tbname) 清空,同时删除临时表中该id号的那条
delete from #tep where id=@id 纪录。如此循环到最后临时表纪录为
end 空则数据库中用户表数据也清空 。*/
drop table #tep
GO 对于这个问题的不解之处是我一开始只在一个固定的库中测试,所以没有用到引用库名的那个 '@dbname'参数,先没有用到这个变量所以关于临时表创建和赋值语句就没用到exec(@sql)。直接这样
create table #tep(id INT IDENTITY(1,1) PRIMARY KEY,t_name varchar(50))
insert into #tep select name from dbname..sysobjects where xtype='U' and name<>'dtproperties'
。。。
后来因为要实现对任意库操作,再做了修改才成为答题中那样。发现这部分代码如果这样写 set @sql='create table #tep(id INT IDENTITY(1,1) PRIMARY KEY,t_name varchar(50))
insert into #tep select name from '+@dbname+'..sysobjects where xtype=''U'' and name<>''dtproperties'''
exec (@sql)
就是说把前面的创建临时表语句也放到@sql里,执行该sp的结果这样:
(所影响的行数为 35 行)
服务器: 消息 208,级别 16,状态 1,过程 deldbdata,行 13 对象名 '#tep' 无效。
我不明白为什么会这样。这样写我犯的是什么错误?唠叨了半天,不知道我表达清楚了没有。先贴出来请老师看看吧。3、写一个存储过程,要求这个存储过程返回某一个表的记录数量。
create proc count_tb
@tb_name varchar(50)
as
declare @sql nvarchar(300)
declare @parminfo nvarchar(100)
declare @t_count int
set @sql=N'select @t_count=count(*) from '+@tb_name
set @parminfo=N'@t_count int output'
exec SP_EXECUTESQL @sql,@parminfo, @t_count OUTPUT
return @t_count
go4、写一个存储过程,要求这个存储过程返回某一个表的某一个字段排序下第X条记录的ID值(注:假设该表存在一个整型ID字段,唯一标识)。
create proc searchid_tb
@tb_name varchar(50),
@tb_columns varchar(200),
@tb_record int
as
declare @sql nvarchar(500)
declare @praminfo nvarchar(100)
declare @id int
set @sql=N'select top 1 @id=id from (select top '+CONVERT(nvarchar,@tb_record)+' * from '+@tb_name+' order by '+@tb_columns+') t1 order by '+@tb_columns+' desc'
set @praminfo=N'@id int output'
exec sp_executesql @sql,@praminfo,@id output
return @id
GO