这些是比较常用的命令操作,事先声明,这些命令是不区分大小写的,我按照我的课本来总结用法和知识点,无用的章节自动省略。

  如果这篇博客的知识点你全部看完掌握了,那你就SQL数据库入门了,一定要认真看并且自己手打几次!祝你好运~

    这篇博客很长很长,大概是我目前最长的博客了,不要被长度吓到,内容简单的吓尿你?

 第二章:创建和管理数据库

这里是一个创建数据库并初始化的例子,先大致看一下,接下来我们慢慢讲?

创建数据库并初始化:



create database Student4   --创建数据库,名称为Student4--


--下面是数据库的初始化,可以不写,了解就行--
on
primary
(
name=Student4_dat1,
filename='E:\DataBase\Student4_dat1.mdf',       --主数据文件,起始大小100M,最大200M,超出100M后每次增加20M--
size=100mb,
maxsize=200,
filegrowth=20),

(
name=Student4_dat2,
filename='E:\DataBase\Student4_dat1.ndf',         --次数据文件,同上--
size=100mb,
maxsize=200,
filegrowth=20
)
log on
(
name =Student4_log1,
filename='E:\DataBase\Student4_log1.ldf',          --日志文件,增长5%--
size=100mb,
maxsize=200,
filegrowth=5%
),
(
name =Student4_log2,
filename='E:\DataBase\Student4_log2.ldf',           --日志文件2,超出容量后每次增长20M-- 
size=100mb,
maxsize=200,
filegrowth=20
)



 ok,看完上面的例子是不是感觉很麻烦?没关系,接下来我们一步一步的讲咯。注意!数据库中的注释符号是-- 而不是 // 还有在数据库中是不分大小写的

1.创建数据库



create database student --创建了一了数据库,这是最简单的方式了



2.删除数据库:



DROP DATABASE name   --name是数据库的名字
DROP DATABASE name1,name2     -- 删除多个以逗号分隔



3.更改数据库名称:



ALTER DATABASE name          --这个name是数据库的名称
MODIFY NAME=name1



还有另外一种方法:



EXEC sp_renamedb 'name','name1'          --把name改成name1



 

4.备份数据库:

升级数据之前通常要备份一下,就算出问题了也能还原回来不是?



BACKUP DATABASE name TO DISK='E:\name.bak'



5.还原数据库:

尴尬了,你的数据升级的时候出问题了,不过没关系,我们还原回来就好了



RESTORE DATABASE name FROM DISK='E:\name.bak'



 6.分离数据库

你在操作数据库的时候想把你的工程拷走又不想关闭数据库怎么办?很简单,分离一下就好了,这个也有代码不过最常用的是鼠标操作,所以我就不贴代码了(懒?)

当前数据库→单机右键→任务→分离

7.附加数据库

你已经把你做的工程拷回来了,想在自己的电脑上打开玩玩,这个时候我们选择附加数据库(附加数据库的时候可能出现问题,这个参见我的另一篇博客,专门有写这件事)

 

数据库→单机右键→附加

然后找到你的mdf文件直接附加上去

 

 

到此第二章关于数据库的就结束了,其实数据库这个东西最重要的部分在于数据,接下来重点要开始咯。

 

 第三章:创建和管理表

表是承载数据的东东,其重要性不言而喻

 1.创建表



use Student              --你在哪个数据库下面操作就引用哪个数据库--

create table 学生        --创建一个表,表名是 学生
(学号 char(12) ,
 姓名 nchar(3) ,
 性别 nchar(1) ,
)



这是最简单的一个表了,她的列我都没有加约束,我会在这一章的最后放出一个完整的表来讲。

2.查看表

如果是查看表的结构:

当前表→单击右键→设计

如果是查看表的数据:

当前表→单击右键→编辑表的前200行

写到这里包括下面的一些数据的操作其实都是差不多的,无非就是四个字:增删改查  下面我就直接讲增删改查了

 

1.增(格式用alter,add 数据用insert)

表里插入数据



insert student values('201408090022','张泉','男')



插入新列



alter table student
add 联系电话 char(15) null



2.改 (格式用alter,数据用update)

将学生表的联系电话改为char(50)   



alter table student alter column 联系电话 char(50)



将所有课程的学分加1



update 课程 set 学分=学分+1 where 课程类别='必修'



3.查

这个大有讲头,一般都是通过鼠标操作,不过代码也有,而且是重点内容,关于这部分在第五章介绍。

往下拉到第五章,在那见?

 

4.删(删除数据一般用delete,删除列和表这些架构用drop)

终于到删除这个重头戏了

删除表中所有行



delete student



删除表中特定行



delete from student where 名字='蜀云泉'



删除表中的某一个列



alter table student drop column 联系电话



清空表(其实和删除表中所有行差不多,不过这个的区别大家自己去查吧)



truncate table student



删除表



drop table student



 

嗯,说好了在最后放出几个例子来的,下面就是咯,看过了上面的内容看看你能不能看懂下面的例子。

 

 

创建三个表,分别是学生表,课程表和选课表。学生表的主键是学号,课程表里有一个层级关系,主键是课程编号,选课表里是一个联合主键,分别是参考的学生表的学号和课程表的课程编号,这是一种约束关系,这就导致了如果你想删除学生表里面的某个学生就必须先解除约束关系,否则你删不了的。

 

创建 “学生” 表  (大家不要学我打汉字,我为了方便。。。)



use Student      --我引用一个已经创建好的数据库--
create table 学生
(学号 char(12) primary key,            --这里我给列加上了约束,关于约束重点在第四章讲--
 姓名 nchar(3) not null,
 性别 nchar(1) check(性别 in('男','女')),
)



创建 “课程” 表



create table 课程
(
课程编号 char(4) primary key,
课程名称 nvarchar(20) not null ,
层级关系 char(4) references 课程(课程编号),  --层级关系的意思是必须学了上一个才能学下一个,比如必须学了c语言才能学数据结构--
学分 tinyint not null default 4
)



创建 “选课” 表



create table 选课
(
学号char(12) references 学生(学号),      --这就是外键约束--
课程编号 char(4) references 课程(课程编号),
成绩 tinyint check(成绩 between 0 and 100),  --成绩在0~100之间--
primary key (学号,课程编号) --联合主键写在这里,单个的可以写在语句后面--
)



在学生表里插入数据



use(想操作的数据库名称)
insert 学生表
values('201408090001','赵云','男');
insert 学生表
values('201408090002','许嵩','男');



 在课程表里插入数据



use (想操作的数据库名称)
insert 课程表
values('0001','c语言基础',null,2);
insert 课程表
values('0002','数据库','0001',2);//不学c语言就无法学数据库,这是一种递进的层级关系



在选课表里插入数据



use 想操作的数据库名称
insert 选课表
values('201408090001','0001',80);
insert 选课表
values('201408090002','0002',82);



更新选课表里面学号为1和2两位同学的成绩



use 想操作的数据库名称
update 选课表 set 成绩=成绩*0.7+20 where 学号='201408090001'
update 选课表 set 成绩=成绩*0.7+20 where 学号='201408090002'



 

现在我们讲了插入和更新,现在来解决删除的问题,我现在想删除赵云这个同学的信息,可以吗?答案是不行的,因为赵云同学的学号是选课表的外键,他们之间具有约束关系,所以你是删除不了的,那怎么办呢?解除约束关系就好了

 

 解除约束关系



use 想操作的数据库名称
alter table 选课表
drop constraint FK__选课表__学号__0EA330E9//这个是约束关系,每个人应该不一样,在列表里面自己找哦



现在已经解除赵云同学的约束啦,现在我们来删除他的信息,呜呜~

 

删除赵云同学的信息



use 想操作的数据库名称
delete from Student where 姓名='赵云'



 

 

 故事已经说完,懒得圆满。

 

第四章:索引与数据完整性

 这一章我会讲 规则,默认值,6大约束 这三个部分,其中规则和默认值差不多,6大约束是重点?

 

索引

索引是一个很重要的知识点,其实索引就相当于目录。比如我要在一本介绍数据库的书中查找关于索引这一块的知识点,如果没有目录的话我要一页一页的查找,其实是翻遍整本书去找,这样的效率可是真的很低很低了,但是如果有了目录,那我直接翻目录,找到索引所在的页数,直接翻过去看就行了,效率提升了很多。所以这就是索引的好处。当然索引也有缺点,就是占据了物理空间,而且索引也需要维护成本,你添加或者删除数据,索引也是要跟着变的,这样在数据库语句的执行速度上就有点慢了。

索引大致是分为聚集索引和非聚集索引,至于更为详细的信息请参考这篇文章

 

规则

1.创建规则

创建课程类别规则



create rule course_rule
as @sort='选修' or @sort='必修'



创建学分规则



create rule credit_rule
as @value>0



2.查看规则



exec sp_helptext course_rule



3.绑定规则

将创建的课程规则course_rule 绑定到课程表的课程类别上



exec sp_bindrule course_rule,'课程.课程类别'



将创建的学分规则credit_rule 绑定到课程表的学分列上



exec sp_bindrule credit_rule,'课程.学分'



4.解绑规则



exec sp_unbindrule '课程.课程类别'



5.删除规则



drop rule course_rule,credit_rule



 

 默认值

1.创建默认值

创建民族默认值



create default nationality_default as '汉族'



2.查看默认值



exec sp_helptext nationality_default



3.绑定默认值

绑定默认值nationality_default到学生表的民族列上



exec sp_binddefault nationality,'学生.民族'



4.解绑规则



exec sp_unbinddefault '学生.民族'



5.删除规则



drop default nationality_default



 

 规则和默认值已经讲完了,他俩是不是很像很像,接下来是重点!6大约束

 

6大约束

咱们先来明确概念,4大完整性对应6大约束,下面的表格很直观

 

4大完整性

6大约束

实体完整性

主键约束

参照完整性

外键约束

域完整性

 

用户自定义完整性

非空值约束,默认约束,唯一性约束,检查约束

 

1.主键约束

主键具有唯一标识,一个表里面只能有一个主键,主键分为两种:列级和表级

比如下面这张学生表,学号和身份证都是唯一的,都能区分你的身份,所以都有当主键的资格:



create table 学生
(学号 char(12) ,
 身份证号 char(18) ,
 姓名 nchar(3) ,
 性别 nchar(1) ,
)



列级的主键:



--列级主键--
create table 学生
(学号 char(12) primary key,      
 身份证号 char(18) ,
 姓名 nchar(3) ,
 性别 nchar(1) ,
)



直接写在列后面的,就叫列级主键,由于主键只能有一个,所以学号是主键,身份证号就没办法作为主键了。

表级的主键:



--表级主键--
create table 学生
(学号 char(12) ,      
 身份证号 char(18) ,
 姓名 nchar(3) ,
 性别 nchar(1) ,
constraint pk_xuehao_shenfenzheng primary key(学号,身份证号)      --那个大长串是约束名,constraint pk_xuehao_shenfenzheng可以不写-- )



如果我想学号和身份证号都作为主键,那就把主键约束写在表的最后,这样就是表级约束了,表级约束里面主键的主键值可以多个,但是主键只能有一个!

表级约束需要写约束名

2.外键约束

外键约束定义了表与表之间的关系,外键约束可以参考其他表也可以参考自己表。也分为列级和表级,不过外键约束没有唯一性,所以都写列级上也没关系,但是列级和表级的外键约束是不一样的,在选课表里我会说明。好了,我讲了这么多是什么意思呢?看下面的三个表还有我的注释。

 

学生表



use Student      
create table 学生
(学号 char(12) primary key,            --列级主键约束--
 姓名 nchar(3) not null,               --非空值约束,下面讲--
 性别 nchar(1) check(性别 in('男','女')),    --检查约束,下面讲--
)



课程表



create table 课程 ( 课程编号 char(4) primary key, --列级主键约束-- 课程名称 nvarchar(20) not null , --非空值约束,你应该会了。。。-- 层级关系 char(4) references 课程(课程编号), --参考自己表内的外键约束-- 学分 int not null default 4 --非空值约束和默认约束-- )



选课表



create table 选课
(
学号char(12) references 学生(学号),      --这就是列级外键约束的格式--
课程编号 char(4) ,
成绩 tinyint check(成绩 between 0 and 100),  --检查约束,检查成绩是否在0~100之间--
primary key (学号,课程编号)                --联合主键又叫表级主键--



constraint fk_kecheng foreign key(课程编号) references 课程(课程编号) --表级外键约束,constraint fk_kecheng 这些东西都可以不写--



)



3.非空值约束

这个在外键约束的例子里已经有过例子了

为课程表的课程名称 字段设置非空值约束



alter table 课程 
alter column 课程名称 varchar(30)  not null



4.唯一性约束

比如我把学生表的姓名定义为唯一的(我就不让你们班有重名的,哼?)



use Student      
create table 学生
(学号 char(12) primary key,            --列级主键约束--
 姓名 nchar(3) not null,               --非空值约束--
 性别 nchar(1) check(性别 in('男','女')),    --检查约束--
constraint uk_name unique (姓名)          --唯一性约束,姓名唯一了,同样constraint uk_name 可以省略不写
)



5.检查约束

检查约束通常是设置条件范围,比如性别只能是男女,年龄必须是正数

 

为学生表的性别加上检查约束



use Student      

alter table 学生
add check(性别 in('男','女'))



 

6.默认约束

比如我把学生表的身份证号都设置的默认为0



use student

alter table 学生
add default '0' for 身份证号  --我省略了constraint 约束名  这些东西,不写也没啥,写了你也记不住,到时候用鼠标看看就知道了



7.删除约束

6大约束讲完了,现在终于到了尾声,我们来讲讲怎么删除约束,如果是鼠标直接找到那个约束,单机右键删除了事。如果是代码,看下面的例子

 

从学生表删除默认约束



alter table 学生
drop constraint 约束名  --这个约束名,如果你在定义约束的时候写了那就朝抄下来,如果你懒没有写省略了,那就用鼠标在左面的操作栏找到这个约束,复制名字就好



 

终于写完这一章了,容我歇会,呼呼~

 

第五章:查询与视图

先来讲查询,查询呢分为三个部分来讲,分别是基本查询,嵌套查询,联结查询

1.基本查询

基本查询这一章主要就是select语句,与select语句配合最多的就是from语句和where语句,其中where和select语句所搭配的子句也是蛮多的。

 先来了解一下select,from,where这三个语句的用法

查找学生表中性别是男的所有学生的信息:



select * from 学生 where 姓别='男'



where语句的子句



--between子句:字段的内容在制定的范围内--
select * from 课程 where 学分 between 2 and 5

--like子句:对字符串进行比较提供两种通配符,即下划线“_”和百分号“%”,下划线表示一个字符,百分号表示0个或多个字符-- select * from 课程 where 课程名称 like '%数据库%'

--In子句:字段内容是结果合集或者子查询中的内容-- select 学号 , 课程编号 , 成绩 from 选课 where 课程编号 IN('C606','C607' )

--Is子句:数据一般是'=' 而'Null'这种类型就不能用等号了得使用Is-- select 专业名称 ,成立年份 from 专业 where 专业简介 IS null



 select语句的子句



--排序输出:order by默认按升序排序,asc是升序,desc是降序--
--按专业名称升序排列学生表里的学号,姓名,性别,入学成绩,专业名称,专业名称相同的就按入学成绩的降序排列--
select 学号 , 姓名 , 性别 , 入学成绩 , 专业名称 from 学生 
order by 专业名称 asc ,入学成绩 desc

--into子句:把查询的结果放入一个新建的表中--
--将学生表里面有奖学金的学生的所有信息存放到新建表st_new中--
select 学生 .* into st_new from 学生 where 有否奖学金 = 'ture'

--union将不同的查询数据结合起来,会自动的将重复的数据行删除--
--在学生表里列出专业名称为工程管理或工程力学的所有同学的学号,姓名,专业名称--
select 学号 , 姓名 , 专业名称 from 学生 where 专业名称 ='工程管理'
union
select 学号 , 姓名 , 专业名称 from 学生 where 专业名称 ='工程力学'

--group by 将一个或多个列或者表达式的值将结果集中的行分成若干组--
--在选课表,查询每门课程的最高分--
select 课程编号 , MAX (成绩) as 最高分 from 选课 group by 课程编号 

group by这里有一点是需要注意的,否则你将不能使用它,参见这篇博客的第3条知识点


另外还有其他很多的子句,这里就不一一介绍了,因为我感觉没啥大用处,考试估计也不会考,有需要的请自己去查询吧



 2.嵌套查询

嵌套查询分为两种类型:单值嵌套查询和多值嵌套查询

单值嵌套查询:子查询的返回值是一个值,由于返回值是一个所以可以使用'=' ‘>’ ‘<’等符号



--对学生表列出和李思思相同专业的所有同学的学号和姓名--
select 学号, 姓名 from 学生 
where 专业名称 =(select 专业名称 from 学生 where 姓名 ='李思思')



多值嵌套查询:子查询的返回值是多个值,是一个结果集,通常使用any,all,in此类运算符 



--列出选C901课程的学生的成绩比C902课程的最低成绩还要高的学生的学号,成绩--
select 学号 , 成绩 from 选课 
where 课程编号 ='C901' 
and 成绩 > any (select 成绩 from 选课 where 课程编号 ='C902')  --这里需要说明的是,由于any返回的是一个结果集所以比较的时候会比到最低分的,以下同理--


--列出选C901课程的学生的成绩比C902课程的最高成绩还要高的学生的学号,成绩--
select 学号 , 成绩 from 选课 
where 课程编号 ='C901' and 
成绩 > all (select 成绩 from 选课 where 课程编号 ='C902')         --再次强调,这是结果集--


--选课表,查询选修C901或C902课程的学生的学号和姓名(包括任意选一门或者选两门的情况)     --我感觉下面的方法真鸡肋,明明一条语句就行了,还多此一举,画蛇添足。--
select 学号, 姓名 from 学生 where 学号 in
(select 学号 from 选课 where 课程编号 ='C901' or  课程编号 ='C902')   --方法1--
select 学号, 姓名 from 学生 where 学号 in
(select 学号 from 选课 where 课程编号 in ('C901' , 'C902'))           --方法2--



3.联结查询

联结查询分为内联结,外联结,交叉联结三种

内联结:包括等值联结和不等值联结



--内联结的等值联结,就是'='了--
--将课程表和选课表按课程编号相等值进行联结,并统计每门课程的选课人数--
select 课程名称,count(*) 选课人数 from 课程 inner join 选课
on 课程.课程编号=选课.课程编号 group by 课程名称


--内联结的不等值联结--
--在选修C901课程的学生中,查询成绩高于学号为S0101的学生选修该门课程成绩的同学的学号和成绩--
select a.学号,a.成绩 from 选课 a inner join 选课 b on a.课程编号=b.课程编号 and
a.成绩>b.成绩 where(a.课程编号='C901') and (b.学号='S0101')



外联结:包括左外联结,右外联结和全外联结



--外联结的左外联结,就是左面的全都显示右边没有就显示null--
--学生表左外联结选课表--
select a.学号,a.姓名,b.课程编号,b.成绩
from 学生 a left outer join 选课 b on a.学号=b.学号


--外联结的右外联结,就是右面的全都显示左边没有就显示null--
--选课表右外联结课程表--
select a.学号,a.成绩,b.课程编号,b.课程名称,b.课程类别,b.学分
from 选课 a right outer join 选课 b on a.课程编号=b.课程编号



--外联结的全外联结,没有就显示null--
--学生表全外联结选课表--
select a.学号,a.姓名,b.课程编号,b.成绩
from 学生 a full outer join 选课 b on a.学号=b.学号



交叉联结:没有where子句



--学生表交叉联结选课表--
select a.学号,a.姓名,b.学号,b.课程编号,b.成绩
from 学生 a cross join 选课 b



 

查询到这里就已经讲完了,外联结需要重点看一下,接下来我们来讲视图

 

视图

这就是视图的可视化界面,但是这个我们一般不用,写视图代码就是了。

sql server primary 组满了 sqlserver on primary_外键约束

 

1.创建视图



use 教学管理   --先选中执行use再选中执行下面的命令--
create view score_view
as
select 学生.学号,学生.姓名,选课.课程编号,选课.成绩
from 学生 inner join 选课 on 学生.学号=选课.学号



2.删除视图



drop view score_view



那么我现在来讲一讲视图是干什么的?为什么存在这个东西?

如果你很频繁的去连表查询,例如连接3个表或者更多的表去查询你想要的数据,注意是很频繁的操作,下面介绍两种方法:

1.把一大串sql语句写完之后保存就可以了,但是sql语句保存之后你还得找,说不定哪天删了或者找不到了岂不是要重写?而且你在执行的时候那么大一串子语句很麻烦的,有时候要复制粘贴再选中执行.....(优点:占用硬盘空间小    缺点:sql语句太长了,麻烦)

2.有人说我可以把这多个表之中我想要的数据都存到一个新表里面,这样我以后直接查询这个新表不就简单一些了?这是一个好想法,但是!你新建新表不占空间啊?浪费硬盘占有量啊!                         (优点:sql语句短了    缺点:占用硬盘空间大)

还有没有什么更好的方法,更简单的方法,更无脑的方法呢?我们的视图闪亮登场!解决一个问题的方法有很多很多,总有一个相对来说更简单的方法

视图:把你写的一大串sql语句存起来,保存成为一个视图,参考我上面的创建视图,就是那样写的,这样以后你再去查询多表得到数据的时候,可以直接select视图了,又短又几乎不占硬盘空间,结合了上面介绍的两种方法的优点。这就是视图的意义所在了。

 

 

 第六章:T-SQL程序设计

这一章我们来重点讲解变量,函数,游标

1.变量

我们来自己定义变量,举三个例子大家一看就明白了



--6.1      //定义一个局部变量并显示
declare @num int
select @num=16
select @num

--6.2
declare @credit float
update 课程 set @credit=学分 where 课程编号='C501'

--6.3
declare @sum int
set @sum=(select COUNT(*) from 学生)
select @sum



 2.函数



--6.17  函数1,平均函数
create function course_avg(@course_id varchar(10))    --定义一个函数,函数名是course_avg,参数是课程编号
returns float                                         --确定函数的返回值类型为float
as
begin
return (select avg(成绩) from 选课 where 课程编号=@course_id )      --根据这个课程编号计算出平均值并返回
end

select  dbo.course_avg('C501') as 平均成绩                   --这里是这个函数的调用,as是重命名的意思,可以省略



下面来一个函数,这个函数用到了IF语句,也用到了递归。



ALTER function [dbo].[GetAddress](@EqAddress varchar(10))    
returns varchar(10)                                        
as
begin
declare @ParentClassID varchar(15) --变量父ID
declare @ID varchar(15) 

SELECT @ParentClassID = ParentID  FROM Address  where  ID = @EqAddress
if (@ParentClassID <> '0')--如果不是根节点
begin            
    select @ID = dbo.GetAddress(@ParentClassID) 
    select @ID = @ParentClassID 
end
    return  @ID
end



 

3.游标

游标:就是用来看一些数据的共同信息的



--创建游标来访问学号,姓名,专业
declare cur_student Cursor
for
select 学号,姓名,专业名称 from 学生

--打开游标
open cur_student

--读取游标
fetch next from cur_student
while @@FETCH_STATUS=0
begin
   fetch next from cur_student
end
--关闭游标
close cur_student
--释放游标
deallocate cur_student



 

 第七章:存储过程与触发器

存储过程:

存储过程的优点:1.编译后在服务器端 2.一次编译多次调用 3.具有一定的数据安全性

这个是静态的SQL写的存储过程,可以看看这个动态的SQL写的存储过程:戳我



--创建存储过程--
create proc pro @xuehao varchar(10)=null   --创建存储过程pro 一个参数@xuehao 后面是它的类型
as                                         --这个as超重要,不能漏写
if @xuehao=null                            --如果是null,返回10
    return 10
if not exists(select * from 学生 where 学号=@xuehao)    --如果找不到就返回-10
    return -10
select 姓名 from 学生 where 学号=@xuehao               --找到这个人,返回0(不知道你们有没有注意到,这些是按照顺序排列的,不能变顺序)
    return 0

--执行存储过程--
declare @num int                      --定义一个变量来接收结果
exec @num=pro 'S0101'                 --调用存储过程
if @num=10                            --如果是10,那就说明你输入的不对
 select '输入错误'
else 
    if @num=-10                        --10就是没有这个人,0就是有这个人
      select '没有这个人'
    if @num=0
      select '找到了'



这里我用的返回值是return,需要注意的是return只能返回int类型的数字。如果想返回其他形式的答案,请使用out参数,比如:



USE [XXX]
GO
/****** Object:  StoredProcedure [dbo].[OneTable]    Script Date: 2018/1/13 16:04:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[OneTable] @TableName nvarchar(50), @sqlstr varchar(1000) output
as
begin
declare @sql nvarchar(1000)
select  @sql=isnull(@sql+',','')+quotename(Name) from syscolumns where  id=object_id(@TableName) and name not in ('DATE','TIME')

set @sqlstr='SELECT rtrim(convert(varchar,replace([Date],''/'',''-'')))+'' ''+ ltrim(convert(varchar,[Time])) [DateTime] ,P.SupplyNum,p.Supplier
FROM 
(
    SELECT top 1 *
     FROM '+@TableName+'
)T
UNPIVOT 
(    
    SupplyNum FOR Supplier IN
    ('+@sql+')
) P' 
exec (@sqlstr)

end



 

 相较于触发器,存储过程在你以后的工作中会用的更多,所以一定要好好写存储过程。

 存储过程讲完了,超简单吧,下面的触发器,呜呜呜~更是简单的没天理呀?

 触发器:

创建一个触发器之后,只要被触发就会执行相应的操作,就是这么简单,而触发条件也很简单,无非就是三种,增删改create trigger tr_test --创建触发器



create trigger chufaqi
on 学生 for insert,update,delete --触发条件,增删改 as select * from inserted --inserted和deleted是数据库系统在触发的时候自动创建的两个表,inserted表存放了插入和更新数据时的变化 select * from deleted --deleted存放了删除的时候的信息 insert into 学生(学号,姓名,性别) --插入数据,增 values('S1112','李三','男')
delete from 学生 --删 where 姓名 = '李三'



update 学生 set 性别='女' where 姓名='李三' --改






 

 

故事到此忽然~了结~