posts - 48,  comments - 5,  trackbacks - 0

*******************逍湘数据库学习文档*******************************
use master                    --打开数据库
go
select * from sysdatabases       --查看所有数据库的相关信息
sp_helpdb pubs                --查看指定数据库的相关信息
use master
go
execute sp_tables             --查看数据库中的所有表名
sp_spaceused                  --查看数据库数据空间
sp_spaceused xiaoxiangwang    --查看数据库中表的数据空间
dbcc sqlperf(logspace)        --查看数据库日志空间
sp_helpfile                   --查看数据库的文件信息
sp_helpfile pubs_log         
sp_helpfilegroup              --查看数据库的文件组信息
sp_help:报告有关数据库对象、用户定义数据类型或SQL Server所提供的数据类型的信息sp_helptext:用于显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本.。    
sp_depends:用于显示有关数据库对象相关性的信息
sp_stored_procedures:用于返回当前环境中的存储过程列表。


--------------------------------------------------------------------------
***************************创建数据库*************************************
create database TestDb     --创建数据库
on primary
( name ='TestDb_data1',    --主数据文件
  filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_data1.mdf',
size=1,maxsize=unlimited,filegrowth=10%),
filegroup data2
( name ='TestDb_data2',   --辅数据文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_data2.mdf',
size=2,maxsize=100,filegrowth=1)
log on
( name ='TestDb_log1',     --事务日志文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_log1_ldf',
size=1mb,maxsize=25mb,filegrowth=10%)

alter database testdb      --修改数据库添加文件组
add filegroup data3
go
alter database testdb
add file
( name ='TestDb_data3',    --添加辅数据文件
filename ='E:\SQL Server\SQL2\MSSQL\Data\TestDb_data3.mdf',
size=2,maxsize=100,filegrowth=1)
to filegroup data3
go
alter database testdb
remove file testdb_data3   --删除文件
go

execute sp_helpdb
execute sp_helpdb testdb   --查看数据库定义信息
sp_spaceused               --查看数据库数据空间
sp_spaceused tablename     --查看表空间
dbcc sqlperf(logspace)     --查看数据库日志空间
sp_helpfile                --查看数据库的文件信息
sp_helpfile  testdb_log1   --查看指定文件的信息
sp_helpfilegroup           --查看数据库文件组信息
sp_helpfilegroup  data2    --查看指定文件组的信息

dbcc shrinkdatabase (testdb,20,notruncate) --压缩数据库
sp_renamedb 'Testdb' ,'testdb2'      --重命名数据库
drop database testdb              --删除数据库

**************************创建表*******************************************
create table xinxibiao         --创建表
(Sno int not null identity,Sname char(8) not null,
Ssex char(4) not null,Sage int not null,Sdept char(10) not null)
on [primary]

alter table xinxibiao          --修改表结构
   alter column sage char(4) not null   --修改列
alter table xinxibiao                  
   add email char(10) null            --添加列
alter table xinxibiao                  
   drop column email                   --删除列

insert into xinxibiao          --以一行插入数据
values( 'ee','ee','ee','ee')
使用INSERT…Values插入行
INSERT  INTO XS_KC(Sno,Cno,Grade) Values(‘6’,’4’,86)

update xinxibiao         --修改表中数据
  set sage='ff'
  where sname='ee'

delete from xinxibiao  where ssex='ee'  --删除指定的行
delete xinxibiao                        --删除表中所有数据
truncate table xinxibiao    --永久删除表中所有数据(不可恢复)

select * from xinxibiao          --查询表中所有数据
sp_rename  'xinxibiao', 'xinxi'    --重命名表
drop table xinxibiao             


数据完整性分类:
(1)实体完整性   (行完整性)
(2)域完整性    (列完整性)
(3)参照完整性
(4)用户定义完整性

数据完整性的实施:
1、约束:
主键约束(Primary Key Constraint)      (标示一行记录的唯一性)
外键约束(Foreign Key Constraint)        (表之间的关系)
唯一性约束(Unique Constraint)          (限制列的内容不能相同)
检查约束(Check Constraint)                 (对输入到列中的数据进行限制)
默认值约束(Default Constraint)           (在列中不输入数值时显示默认值)
2、规则:          (限定输入列的数值)
3、默认值:         (限定输入列的数值)
     (注:规则 和 默认值都是一种数据库对象)
4、索引:
(作用:对表中的一个或者多个字段建立一种排序关系,以加快在表中查询数据的速度。)
簇索引      (以primary key约束建立的索引为簇索引)
非簇索引    (以unique约束建立的索引为非簇索引)
惟一索引  (可以确保所有数据行中任意两行的被索引列不包括NULL在内的重复值)

create table XS
(Sno char(10) not null,Sname char(8) not null,
Ssex char(4) not null,Sage int not null,
Sdept char(10) not null,
constraint PK_XS primary key(Sno))    --主键约束
on [primary]

create table CJ
(Sno char(10) not null,Cno char(4) not null,
Grade numeric(8) not null,
constraint PK_CJ primary key(Sno,Cno),  --主键约束
constraint FK_CJ foreign key(Sno)references XS(Sno) --外键约束
on delete cascade       --级联删除
on update cascade)      --级联修改
on [primary]

Alter table XS            --惟一性约束
   Add constraint u_XS unique nonclustered(Sname)
Alter table CJ            --检查约束
   Add constraint ch_CJ CHECK(Grade>=0 AND Grade<=100)
Alter table XS            --默认值约束
   Add constraint sex default 'nan' for Ssex

Create RULE nl_rule AS @Sage<=30 and @Sage>=10   --创建规则
SP_bindrule nl_rule,'XS.Sage'             --绑定规则
SP_unbindrule 'XS.Sage'                   --解除规则
Drop rule nl_rule                         --删除规则

Create default grade_defa AS 0           --创建默认值
SP_bindefault grade_defa, 'CJ.Grade'     --绑定默认值
SP_unbindefault  'CJ.Grade'              --解除默认值
Drop default grade_defa                  --删除默认值

create unique index XH_INDEX      --创建惟一索引
On XS(sno  DESC)                  --DESC降序  ASC升序
With Fillfactor=80                --指定索引页叶级的填满程度

SP_helpindex XS           --查看索引
SP_rename 'XS.XH_INDEX','XH_INDEX1'  --修改索引名称
drop index  XS.XH_INDEX1             --删除索引
注意:如果索引是用create index语言创建的,则可以使用drop index删除。
如果索引是用create table语言创建的,则只能用alter table删除

create table kc(Cno char(4) not null,Cname char(8) not null,
Credit char(4) not null,constraint PK_KC primary key(Cno))
on [primary]
删除索引:
alter table kc
drop constraint PK_KC
注意:当为表创建主键或唯一约束时,将为该表自动创建与约束同名的索引。在表中索引名必须唯一,因此不能在表中创建或重命名与主键或唯一约束同名的索引。
*************************创建视图****************************************
create view view1
as
select * from xs

create view view2
as
select sno,sage from xs

create view view3
(学号,年龄)
as
select sno,sage from xs

create view view4
as
select cj.sno,cj.grade,xs.sname,xs.ssex
from cj,xs  where cj.sno=xs.sno

select * from view4

create view view5
with encryption       --对视图定义文本进行加密存储
as
select * from view4   --基于视图创建
where view4.grade>50
with check option     --数据修改准则

sp_depends view1      --确定有关数据库对象相关性的信息
sp_help view2         --返回有关数据库对象的详细信息,如果不针对某一特定对象,则返回数据库中所有对象信息
sp_helptext view4     --显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本
*************************************************************************
alter view view2      --修改视图
as
select sno,sname,ssex,sage,sdept --增加字段
from xs

execute sp_rename view1,view6  --重命名视图
drop view view6         --删除视图

select * from xs
select * from view2

insert into view2      --通过视图向表中插入一行数据
values('3','cc','nan',20,'bb')

update view2           --修改数据
set ssex='nv'
where sname='bb'

delete view2       --删除数据
where sno='1'

delete view2       --删除所有数据

----------------------------------------------------------------------------
**************** Transact-SQL 语言 ****************************************
1、注释语句
“--”(双连字符),表示单行注释,从双连字符开始到行尾均为注释。
/* ... */(正斜杠+星号对),用于多行(块)注释。
注:多行/* */注释不能跨越批处理,整个注释必须包含在一个批处理内
2、RETURN语句
3、PRINT命令
4、事务模式
1.显式事务: 每个显式事务均以BEGIN TRANSACTION语句开始,以COMMIT或ROLLBACK语句结束。
2.隐式事务: 指当前事务在提交或回滚后,自动启动新事务,而无需描述事物的开始。通过Set Implicit_Transaction on/off可以将隐式事务模式打开或关闭。
3.自动提交事务:   自动提交事务是SQL Server的默认事务管理模式,如果一个语句成功的完成则提交该语句;如果遇到错误,则回滚该语句。
4.事务回滚: 当事务中的某一语句执行失败时将恢复到事务执行前或某个指定位置(某个保存点)。
5、局部变量
声明局部变量:  DECLARE @变量名 变量类型
局部变量的赋值:
SELECT  @局部变量=变量值     (可同时对多个变量赋值,用逗号隔开)
       SET  @局部变量=变量值        (只能对单个变量赋值)
6、全局变量
7、算术运算符


8、比较运算符
    (1)>:大于。
    (2)=:等于。
    (3)<:小于。
    (4)>=:大于或等于。
    (5)<=:小于或等于。
    (6)<>(!=):不等于。
    (7)!>:不大于。
    (8)!<:不小于。
9、位运算符

10、逻辑运算符

11、字符串连接符(+)
12、赋值运算符为等号(=)
13、程序流控制语句

WAITFOR语句指定延迟一段时间(时间间隔或一个时刻)来执行(触发)一个Transact-SQL语句、语句块、存储过程或事务。
waitfor delay ‘01:10:00’   --等待1小时10分后才执行select语句。
    select * from  xs
        waitfor time ‘11:12:00’   --等到11点12分才执行select语句。
    select * from  xs
--------------------------------------------------------------------------
**************************************************************************
declare @x int,@y int        --用declare声明两个局部整型变量@x,@y
select @x=3,@y=5             --用select给两个局部变量赋值
print @x; print @y; print @x+@y;    --显示输出
if @x>@y                   --如果局部变量@x>@y,退出程序
    return        
else                         --否则,输出my god!!
    print 'my god!!' 

declare @m char(10), @n char(10)
select @m='SQL',@n='Server'
print'微软公司'
print @m+@n

DECLARE @gh char(4),@xm char(8)      --用declare声明两个局部字符变量
SELECT @gh = '0014'             --用select给局部变量@gh赋值
SET @xm='上官云珠'              --用set给局部变量@xm赋值
print @gh+@xm                      
Go

use testdb2                        --begin tran(事务开始) 
insert xs(sno,sname) values(7,'2006上期')
go
insert xs(sno,sname) values('dfdf')      --错误语句
go
if @@ERROR>0           --@@ERROR为全局变量
begin                  --rollback(事务中的insert语句执行失败时将恢复到事务执行前,即回滚)
return                -- return语句结束当前程序,无条件退出
end                    --commit(标志事务的结束)
go

select * from xs
delete xs

use testdb2
begin tran                         --事务开始 
insert xs(sno,sname) values(9,'2007上期')
go
insert xs(sno,sname) values(10 )     --错误语句
go
if @@ERROR>0      --@@ERROR为全局变量
begin
rollback         --事务中的insert语句执行失败时将恢复到事务执行前,即回滚
return           -- return语句结束当前程序,无条件退出
end
commit            --标志事务的结束
go
---------------------------------------------------------------------------
--求2000到2100年间的所有闰年,将结果输出。
DECLARE @i int
select @i=2000
while @i<=2100
begin
  if (@i%4=0 and @i%100<>0) or (@i%400=0)    --假如为闰年,则输出 
  print @i
    set @i=@i+1             --循环变量自增1
end
go

DECLARE @A INT,@B INT,@C INT
SELECT @A=3,@B=4
WHILE @A<6
BEGIN
        PRINT @A   
       WHILE @B<7
        BEGIN
         SELECT @C=100*@A+@B
           PRINT @C       
SELECT @B=@B+1
       END
     SELECT @A=@A+2
     SELECT @B=1
END

--求1!+2!+3!+4!+…+10!的和,并输出
declare @i int,@sum int,@t int     --声明三个局部整型变量
select @i=1,@sum=0,@t=1            --给三个局部变量赋值
while @i<=10            --当@i<=10时,执行begin...end语句块   
begin
set @t=@t*@i           --给局部变量@t,@sum赋值
set @sum=@sum+@t
set @i=@i+1            --循环变量自增1
          end
   PRINT '1!+2!+3!+4!+…..+10!='+CAST(@SUM AS CHAR(10))
***************************************************************************
三种方法指定别名:
     列表达式 AS 列别名
     列表达式    列别名
       列别名 =  列表达式
----------------------------------------------------------------------------
*****************数据查询***************************************************
SELECT语句的语法格式:
      SELECT  select_list   
      [ INTO new_table ]   FROM  table_source
     [WHERE search_condition] 
      [GROUP  BY  group_by_expression ]
      [ HAVING  search_condition ]
      [ ORDER BY order_expression [ ASC | DESC ] ]
      [COMPUTE 子句]  [FOR 子句]   [OPTION 子句]
SELECT子句的语法
SELECT [ALL | DISTINCT] [TOP  n [ PERCENT] [WITH  TIES] ]
   <选择列表>
   <选择列表>::=
   {* | {表名| 视图名 | 表别名}.*
    | { 列名 | 表达式 | IDENTITYCOL | ROWGUIDCOL }
    [ [ AS ] 列别名 ]
    | 列别名 = 表达式
    }   [ ,…n ]

(1)选择指定列:
    select column_name [,column_name…]
    from  table_name
    [where search_condition]
(2)选择所有列:
    select * from  table_name
    [where search_condition]
(3)为所选列指定别名:
     select  column_name  as  column_alias               
     [,column_name  as  column_alias …]
   from   table_name
     [where  search_condition]
(4)替换查询结果中的数据:
  select  column_name [,column_name…]
            结果表列名称=
            CASE
                WHEN  条件1  THEN 表达式1
                WHEN 条件2   THEN 表达式2
                 ……
                 ELSE  表达式
         END
  from   table_name   [where  search_condition]
(5)计算列值:
select  CPMC  as  ‘产品名称’,产品总值=DJ*SL
  from  CP
(6)消除重复的行:
select  DISTINCT  column_name [,column_name…]
from   table_name
[where  search_condition]
(7)限制结果集返回的行数:
select  TOP n  [PERCENT]  column_name [,column_name…]
  from   table_name
  [where  search_condition]
(8)数据类型转换:
例:select Sno,(Cno + CAST(Grade AS     VARCHAR(4))) AS 课程成绩
  from xs_kc

WHERE子句
1、表达式比较:
   select *
   from  table_name
   where expression 比较运算符 expression
2、模式匹配:
  select  *   from   table_name
  where  expression  [NOT]  LIKE  string_expression 
  [ESCAPE ‘escape_character’]
  注意:与LIKE一起使用的通配符如下:
          _(下划线)可匹配任意单个字符。
          %(百分号)可匹配任意类型和长度的字符。
          [  ]可匹配在指定范围内的任何单个字符.
          [^]可匹配不在指定范围内的任何单个字符.
3、范围比较:
例: select  *  from  cp  where  dj  between 200 and 400
    select * from  xs  where  Sage not  between  15  and  20
例:select  * from  xs  where  Sdept not  IN (‘jsj’,‘wxd’)
4、空值比较
例:Select * from  xs  where  Sname  is  not  null
5、contains谓词
Select * from table_name  Where CONTAINS ({column |*},search_condition)
6、FREETEXT谓词
例:select * from xs where freetext (*,’工程’)

子查询: 是一个select 查询,它返回单个值且嵌套在select,insert,update,delete语句或其他子查询中。
(1)IN子查询:
例一: select * from xs where Sno in
     (select Sno from xs_kc where Cno =‘1’)
例二: select Sno,Sdept from xs 
      where  Sno not in 
     (select Sno from xs_kc where Cno in
     (select Cno from kc where Cname =‘SQL’))
(2)比较子查询
where expression 比较运算符{ALL|SOME|ANY}(子查询))
例:select Sno,Grade from  XS_KC
    where  Cno=‘2’ and Grade !< ANY
    (select Grade from  xs_kc where Cno=‘1’)
(3)EXISTS 子查询: 外部查询的WHERE子句测试子查询返回行是否存在,它不产生任何数据,只返回TRUE或FALSE值。
例1:select  Sno,Sname  from  xs 
       where  exists
                   (select *  from  xs_kc
             where  Sno= xs.Sno and Cno=‘2’)
例2:select  Sno,Sname  from  xs 
       where   exists
                  (select * from  kc  
                   where   exists
                               (select *  from  xs_kc
                               where   Sno= xs.Sno  and  Cno=
                                kc.Cno) )

ORDER BY子句:按查询结果中的一列或多列对查询结果进行排序,排序可以是升序的(ASC),也可以是降序的(DESC)。默认为升序。
例:select * from xs
   where Sdept=‘jsj’
   order by Sage DESC
注意:如果在ORDER BY子句中指定了不止一列,排序就是嵌套的。
例:select * from xs
   order by Sage DESC,Sno

GROUP BY 子句: 按字段分组,将查询结果表按某一列或多列值分组输出,值相等的为一组,对查询结果分组的目的是使集函数作用于每一个组,即每一个组都有一个函数值。
例:求各个课程号及相应的选课人数。
    SELECT Cno,COUNT(Sno) as 选课人数
    FROM XS_KC
    GROUP BY Cno
HAVING 子句:
例1:select Sno,AVG(Grade) AS 平均成绩
    from  XS_KC
    group by Sno
    having avg(Grade)>=85
例2:查询成绩在80分以上且选修了2门以上课程的学生学号。
    select Sno from  XS_KC
    where Grade>=80
    group by Sno
    having count(*)>=2
COMPUTE BY子句:
例:计算结果集中成绩的汇总值。
   SELECT TOP 4 Sno,Cno,Grade 等价于 SELECT TOP 4 *
   FROM  XS_KC
   COMPUTE sum(Grade)
注意:计算子组的汇总值时要按照BY选项指定的列排序。
例如: SELECT  TOP  4  *
          FROM   XS_KC
          ORDER  BY Sno
          COMPUTE  sum (Grade)  BY  Sno

分离数据库: SP_detach_db  数据库名 [,true或false]
附加数据库: SP_attach_db  数据库名,数据库文件列表
例:SP_attach_db  test
    ‘E:\sql_exercise\test_Data.MDF’,
    ‘E:\sql_exercise\test_Data_2.NDF’,
    ‘E:\sql_exercise\test_log.LDF’
---------------------------------------------------------------------------
********************联接*************************************************
内联接  仅显示两个联接表中的匹配行的联接,包括等值联接和自然联接。
外联接  包括在联接表中没有相关的行的联接,可分为以下3种。
        1、左向外联接:
        2、右向外联接:
        3、完整外部联接:
        4、交叉联接:

左向外联接:
USE pubs
  SELECT titles.title_id,titles.title,publishers.pub_name
  FROM titles
  LEFT OUTER JOIN publishers ON
  titles.pub_id=publishers.pub_id
右向外联接 :
  USE pubs
  SELECT titles.title_id,
  titles.title,publishers.pub_name
  FROM titles
  RIGHT OUTER JOIN publishers ON
  titles.pub_id=publishers.pub_id
完整外部联接 :
  USE pubs
  SELECT titles.title_id, titles.title,publishers.pub_name
  FROM titles
  FULL OUTER JOIN publishers ON
  titles.pub_id=publishers.pub_id
交叉连接 (笛卡尔积)即为两个表中元组的交叉乘积,因此结果集的大小为两个表中行数的乘积。
例:select Sno,Sname,Cno,Cname
        from xs cross join kc 

谓词连接:连接运算符为=时
例:select  xs.*,xs_kc.*
       from  xs, xs_kc
       where  xs.Sno=xs_kc.Sno  
自然连接:若在等值连接中把目标列中重复的属性列去掉则为自然连接。
例: select  xs.*,Cno,Grade
       from  xs, xs_kc
       where  xs.Sno=xs_kc.Sno
内连接(默认)
例1:select *  from  xs  inner join  xs_kc  on
          xs.Sno=xs_kc.Sno        (等值连接)
例2:select xs.*,Cno,Grade 
    from xs inner join xs_kc on 
    xs.Sno=xs_kc.Sno    (自然连接)

自连接:
例:从成绩表中得到1号课程的名次及学号。
  SELECT xs_kc.Sno,count(*) AS 名次
  FROM  xs_kc inner join xs_kc xs_kc_1 on    xs_kc.Grade<=xs_kc_1.Grade
  WHERE (xs_kc.Cno=1) AND (xs_kc_1.Cno=1)
  GROUP BY xs_kc.Sno
  ORDER BY 名次
多表连接: 两个以上的表进行的连接。
例:SELECT xs.Sno,Sname,Cname,Grade
   FROM xs,kc,xs_kc
   WHERE xs.Sno=xs_kc.Sno and kc.Cno=xs_kc.Cno
等价于:
   SELECT xs.Sno,Sname,Cname,Grade
   FROM xs inner join
        xs_kc on xs.Sno=xs_kc.Sno
           inner join
        kc on xs_kc.Cno=kc.Cno
------------------------------------------------------------------------
(1)使用INSERT…Values插入行
INSERT  INTO XS_KC(Sno,Cno,Grade) Values(‘6’,’4’,86)
(2)使用SELECT  INTO插入行
SELECT * INTO  XS_KC_1 FROM   XS_KC  WHERE(Grade>=60)
(3)使用INSERT…SELECT插入行
INSERT INTO XS_KC_1(Sno,Cno,Grade)
       SELECT Sno,Cno,Grade FROM  XS_KC
        WHERE (Grade>70)

使用SET子句更改数据:UPDATE XS_KC
                    SET Grade=90
使用WHERE子句更改数据:UPDATE XS_KC SET Grade=95
                      WHERE Cno=‘1’
使用FROM子句更改数据:
    UPDATE XS_KC_1 
    SET Grade=XS_KC.Grade
    FROM XS_KC
    WHERE XS_KC_1.Sno=XS_KC.Sno AND XS_KC_1.Cno
    =XS_KC.Cno AND XS_KC.Grade=90

**********************存储过程************************************************
创建存储过程:
CREATE PROC[EDURE] 存储过程名 [;number]
[{ @parameter data_type}[VARYING][=default]
[OUTPUT]][,...n]
[WITH{ RECOMPILE|ENCRYPTION|RECOMPILE,

[FOR REPLICATION]
AS
  sql_statement[...n]

例:
USE master
GO
CREATE PROC PROCEDURE1
    AS
    SELECT Sno,Sname FROM xs
GO

修改存储过程:   
      ALTER  PROC[EDURE]存储过程名[;number]
  [{ @parameter data_type }[ VARYING ] [= default ] [ OUTPUT ] ] [ ,...n ]
  [WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION }]
  [FOR REPLICATION]
  AS
     sql_statement [ ...n ]

执行存储过程:
[EXEC[UTE]]{[@返回状态码=]{过程名[:分组号数]|@过程名变量}}[[@参数名=]{参数值|@参数变量}[[OUTPUT]|[DEFAULT]][,…]]
[WITH RECOMPILE]

例:
use master
   EXEC PROCEDURE1
   GO

删除存储过程:
DROP PROC[EDURE]{存储过程名}[,…]
例:
USE master
GO
DROP PROCEDURE PROCEDURE2

************************触发器************************************************
创建触发器
CREATE TRIGGER 触发器名
   ON{表名|视图名}
   [ WITH ENCRYPTION]
   {{FOR|AFTER|INSTEAD OF}{[DELETE][,][INSERT][,][UPDATE]}
          [WITH APPEND]
          [NOT FOR REPLICATION]
AS
   [{IF UPDATE(列名)[{AND|OR}UPDATE(列名)][...n]
|IF(COLUMNS_UPDATED(){位运算符}位掩码){比较运算符}检验值[ ...n ]}]
   sql_statement [ ...n ] 
   }
例如:
USE testdb2
  IF EXISTS (SELECT name FROM sysobjects --判断要创建的触发器名是否存在
  WHERE name = 'XS_IU' AND type = 'TR')
     DROP TRIGGER XS_IU                  --删除触发器
  GO
  CREATE TRIGGER XS_IU  --触发器名
  ON xx                 --关联的表
  FOR INSERT,UPDATE     --激活触发器条件
  AS PRINT '插入或更新了XS库' --应完成的操作
  GO

使用ALTER TRIGGER命令修改触发器正文
使用系统命令DROP TRIGGER删除指定的触发器:
   DROP TRIGGER{触发器名}[ ,...n]
例:删除名为XS_IU的触发器。
    USE pubs
    GO
    DROP TRIGGER XS_IU
--------------------存储过程的应用----------------------------
例1、
IF EXISTS(SELECT name FROM sysobjects      --判断要创建的存储过程名是否存在
    WHERE name= ‘gjxbxsxx’AND type= ‘P’)
DROP PROCEDURE gjxbxsxx                    --删除存储过程
GO
                                        --创建存储过程
CREATE PROC gjxbxsxx  @xb char(4)= ‘nan’    --建立参数@xb    
AS SELECT Sno,Sname FROM XS WHERE Ssex=@xb
RETURN

执行:
gjxbxsxx ‘nv’
  GO
例2、
IF EXISTS(SELECT name FROM sysobjects
    WHERE name=‘gjxbxsxx'AND type='P')
DROP PROCEDURE gjxbxsxx
GO
CREATE PROC gjxbxsxx  @xb char(4)=‘nan'
AS SELECT Sno,Sname FROM XS WHERE Ssex=@xb
RETURN

例3、
IF EXISTS (SELECT name FROM  sysobjects
       WHERE name=‘gjxhfhcj’
AND type = 'P')
DROP PROCEDURE gjxhfhcj
GO
CREATE PROC gjxhfhcj  @xh char(6), @cj NUMERIC OUTPUT,  --@cj输出参数
AS SELECT @cj=Grade FROM XS_KC
WHERE Cno=‘1' AND Sno=@xh
RETURN
执行:
DECLARE @Grade numeric
EXECUTE gjxhfhcj ‘1',@cj = @Grade OUTPUT
PRINT CONVERT(varchar(6), @Grade)
GO

例4、
CREATE TABLE 测试局部变量表
     (列1 int,列2 char(8))
     GO
     CREATE PROCEDURE 插入行 @初始值 int
     AS
     DECLARE @循环计数 int, @循环变量 int    --包含局部变量的存储过程
     SET @循环变量 = @初始值 - 1
     SET @循环计数 = 0
WHILE  ( @循环计数 < 3)
    BEGIN
      INSERT INTO 测试局部变量表 VALUES (@循环变量 + 1, '新增一行‘)
      PRINT (@循环变量)
      SET @循环变量 = @循环变量 + 1
      SET @循环计数 = @循环计数 + 1
    END
GO

例5、
ALTER PROC gjxbxsxx  @xb char(4)= NULL
AS
IF @xb is NULL
  BEGIN
    PRINT '请输入一个xb作为存储过程的参数'
    RETURN              --存储过程执行到RETURN语句即停止执行
  END
ELSE
  BEGIN
  SELECT Sno,Sname FROM XS WHERE Ssex=@xb
  END
GO

例6、
CREATE PROC jccj @xh char(6)
  AS
  IF (SELECT Grade FROM XS_KC WHERE Sno=@xh)<85
     RETURN 0               --RETURN也可传回整数值
  ELSE
     RETURN 1
  GO
执行:
DECLARE @返回值 int
EXECUTE @返回值 = jccj ‘1'
IF(@返回值=1)PRINT '恭喜你, 成绩优秀!'
GO

使用 SELECT 回传值
CREATE PROC gjxhfh  @xh char(6)
AS SELECT Sno,Grade FROM XS_KC
WHERE Sno=@xh
GO               

ALTER PROC jccj  @xh char(6)
AS
DECLARE @var1 int
IF (SELECT Grade FROM XS_KC WHERE Sno=@xh)<85
    SET @var1 = 0
ELSE
    SET @var1 = 1
SELECT '优秀否' = @var1
PRINT '这里可以添加其它T_SQL语句'
GO
注:当调用 RETURN 时,存储过程跟着结束;当调用 SELECT 时,存储过程则在 SELECT 传
回结果集后,继续执行。

*********************触发器的应用*****************************************
deleted表:储存因 DELETE 及 UPDATE 语句而受影响的行副本。当行因触发器被删除或更
新时,旧的行会传送到delete表;
inserted表:储存因INSERT 及 UPDATE 语句影响的行副本,在插入或更新事务时,新的
行会同时被加至触发器表与inserted表。

DELETE 触发器:
IF EXISTS (SELECT name FROM sysobjects
WHERE name = ‘sccj’ AND type = ‘TR’)
DROP TRIGGER sccj
GO
CREATE TRIGGER sccj
ON xs_kc 
FOR DELETE
AS
PRINT’使用DELETE触发器从成绩库中删除相关行—开始’
DELETE  xs                        --级联删除 xs表
  FROM  xs,deleted
  WHERE  xs.Sno = deleted.Sno
PRINT’使用DELETE触发器从成绩库中删除相关行—结束’
SELECT * FROM deleted

恢复备份:
DELETE xs_kc
INSERT INTO xs_kc SELECT * FROM cj
DELETE xs
INSERT INTO xs SELECT * FROM student
GO

CREATE TABLE cjbf
(Sno char(6) NOT NULL,Cno char(6) NOT NULL,
Grade numeric(18,1) NULL)
GO
CREATE TRIGGER cjbfcfq
ON xs_kc
FOR DELETE
AS
INSERT INTO cjbf SELECT * FROM deleted   --将被删除的列存入cjbf表中
GO

INSERT 触发器:
CREATE TRIGGER cjcrcfq
ON xs_kc
FOR INSERT
AS
SELECT * FROM inserted
PRINT '可以在这里插入其它T-SQL语句,可以使用inserted表'
Go

UPDATE 触发器:
CREATE TRIGGER cjgxcfq
ON xs_kc
FOR UPDATE
AS
DECLARE @更改前成绩 numeric,@更改后成绩 numeric
SELECT  @更改前成绩 = Grade from deleted
PRINT   '更改前成绩 ='
PRINT   CONVERT(varchar(6),@更改前成绩)
SELECT  @更改后成绩 = Grade from inserted
             PRINT   '更改后成绩 ='
             PRINT   CONVERT(varchar(6),@更改后成绩)
             IF(@更改后成绩 > (@更改前成绩 * 1.10))
             BEGIN
                PRINT '成绩更改升幅太大,更改失败'
     ROLLBACK
             END
             ELSE
  PRINT '成绩更改成功'
  GO
执行以下UPDATE的语句,会触发触发器:
UPDATE xs_kc
SET Grade= Grade *1.2 WHERE Sno=‘3'
GO

CREATE TRIGGER cjgxcfq
ON xs_kc
FOR UPDATE
AS
IF UPDATE(Grade)     --设定只有在Grade行被更新时,触发器正确触发        
BEGIN
DECLARE @更改前成绩 numeric,@更改后成绩 numeric
SELECT  @更改前成绩 = Grade from deleted
PRINT  '更改前成绩 ='
PRINT  CONVERT(varchar(6),@更改前成绩)
SELECT  @更改后成绩 = Grade from inserted
PRINT  '更改后成绩 ='
PRINT  CONVERT(varchar(6),@更改后成绩)
IF(@更改后成绩 > (@更改前成绩 * 1.10))
   BEGIN
   PRINT ‘成绩更改升幅太大,更改失败’
   ROLLBACK
   END
    ELSE
   PRINT ‘成绩更改成功’
END
GO

触发器嵌套:
在 SQL Server 2000 中, nested trigger服务器设定参数用来控制触发器能否嵌套触发.
要激活触发器嵌套,可执行以下的指令:
sp_configure "nested triggers", 1
go
将nested triggers设成0时,则不激活触发器嵌套;
将nested triggers设成1时,则可激活触发器嵌套。

例:建立一个基于‘删除’触发的嵌套触发器。
IF EXISTS (SELECT name FROM sysobjects WHERE name =‘scxs' AND type ='TR')
DROP TRIGGER scxs
GO
CREATE TRIGGER scxs
  ON xs
  FOR DELETE
  AS
   PRINT ‘用DELETE触发器从成绩库中删除相关行—开始’
   DELETE xs_kc
   FROM  xs_kc,deleted
   WHERE xs_kc.Sno = deleted.Sno
   PRINT ‘用DELETE触发器从成绩库中删除相关行—结束’
GO
CREATE TRIGGER sccj
  ON xs_kc
  FOR DELETE
  AS
   PRINT ‘用存储过程从课程库中删除相关行—开始’
   DELETE  kc
   FROM  kc,deleted
  WHERE kc.Cno = deleted.Cno
   PRINT ‘用存储过程从课程库中删除相关行—结束’
   SELECT * FROM deleted
GO
执行以下的语句:
DELETE xs WHERE Sno=‘2'
GO
--------------------------------------------------------------------------
************************  游标  ******************************************
游标(Cursor):能对结果集的部分行记录进行处理,不但允许定位在结果集的特定行记录
上,而且还可从结果集的当前位置检索若干条行记录,并可实施对相应的数据修改。
游标分类:
   1、Transact_SQL游标、
2、API服务器游标
3、客户机游标
游标使用步骤:
(1)用DECLARE语句声明,定义游标的类型和属性。
(2)用OPEN语句打开和填充游标。
(3)执行FETCH语句,从一个游标中获取信息(即从结果集中提取若干行数据库)。可按
需使用UPDATE、DELETE语句在游标当前位置上进行操作。
(4)用CLOSE语句关闭游标。
(5)用DEALLOCATE语句释放游标。

例:建立一游标,用于访问pubs数据库中authors表。
use pubs
    DECLARE authors_cursor CURSOR    --声明游标
    FOR SELECT * FROM authors                 
    OPEN authors_cursor                         
   --从游标中提取一记录行,由于没指定SCROLL选项,
   --那么FETCH NEXT是唯一的提取选项。
    FETCH NEXT FROM authors_cursor
    Close authors_cursor             --关闭游标
例:建立一个只读游标
declare cur_authors cursor 
For select au_lname, au_fname, phone, address, city  from authors
for read only

游标变量
declare @pan cursor         --先声明一个游标
declare yu_cur scroll cursor
For select * from titleauthor
set @pan = yu_cur        --将一游标赋值给游标变量

全局变量@@CURSOR_ROWS 变量返回值说明:
返回值
返 回 值  说  明
-m
表示从基础表向游标读入数据的处理仍在进行,(-m) 表示当前在游标中的数据行数。

-1
表示该游标是动态的。由于动态游标可反映基础表的所有变化,因此符合游标定义的数据行经常变动,故无法确定。
0
表示无符合条件的记录或游标已被关闭.

n
表示从基础表读入数据已经结束,n即为游标中已有数据记录的行数据.
@@FETCH_STATUS 变量有三个不同的返回值:
    0:FETCH 语句执行成功。
   -1:FETCH 语句执行失败或者行数据超出游标数据结果集的范围。 
   -2:表示提取的数据不存在。

例:建立一“xs_cursor”游标,用于循环提取master数据库中“xs”表数据
USE master
declare xs_cursor cursor         --声明游标
for select Sno,Sname,Sdept from xs
open xs_cursor                   --打开游标
fetch next from  xs_cursor       --循环提取游标数据
while @@FETCH_STATUS=0  
--检测@@FETCH_STATUS,若仍有记录行,则继续循环
begin
fetch next from  xs_cursor
end
close xs_cursor                --关闭游标
deallocate xs_cursor           --释放游标
例1:
use pubs
  go            
  declare titleauthor_cur cursor global scroll
  For select * from titleauthor
  open titleauthor_cur
  go        
declare @cur_ta1 cursor
set @cur_ta1 = titleauthor_cur
deallocate @cur_ta1   
fetch next from titleauthor_cur
go                         
declare @cur_ta2 cursor
set @cur_ta2 = titleauthor_cur    
deallocate titleauthor_cur
fetch next from @cur_ta2      
go
declare @cur_ta cursor
set @cur_ta = cursor local scroll
For select * from titles
deallocate @cur_ta
go

例2:使用游标语句修改master数据库下“xs_kc”中Sno=‘1’记录的Grade数值。
USE master
declare @xh nvarchar(6),@kch nvarchar(8),
        @cj decimal
declare cj_cur cursor  
for select Sno,Cno,Grade from xs_kc
    where Sno=‘1'
open cj_cur           --提取游标数据
fetch NEXT from cj_cur into      @xh,@kch,@cj
print ‘修改前:’+@xh+@kch+
‘同学成绩为:’+convert(varchar,@cj)
update xs_kc set Grade=Grade+2 
where current of cj_cur
close cj_cur
open cj_cur
fetch NEXT from  cj_cur into @xh,@kch,@cj 
print ‘修改后:’+@xh+@kch+
‘同学成绩为:’+convert(varchar,@cj)
close cj_cur       --关闭游标
deallocate cj_cur     --释放游标   
go

/* 备份数据库的命令 */
BACKUP DATABASE test     /* test指的是数据库名称 */
   TO disk = 'E:\test'   /* 'E:\test' 指数据库备份的路径及文件名 */
   WITH FORMAT,
   NAME = '备份的备注说明'  /* 备份的备注说明 */

/* 还原数据库的命令 */
USE master
GO                      /* 还原时企业管理器必须关闭 */
RESTORE DATABASE test      /* test指的是被还原的数据库名称 */
   FROM disk = 'E:\test'   /* 'E:\test'  指备份文件的的路径及文件名 */
GO

/***************************************
  //create   databse 

CREATE DATABASE test1  ON (NAME='test_Data_bak',FILENAME='E:\test_Data_bak.MDF', 
  SIZE   =   10MB,   FILEGROWTH   =   10%   ) 
  LOG   ON   ( NAME = 'test_Log_bak', 
  FILENAME = 'E:\test_Log_bak.LDF', 
  SIZE = 4MB, FILEGROWTH  =  10% ) 


  //Restore   the   tables   and   sp   from   template   to   new   database  

RESTORE   DATABASE   test
  FROM   DISK   =   'E:\test_Data.MDF'
  WITH   REPLACE, 
  MOVE   'test_Data.MDF'   TO   'E:\test_Data_bak.MDF',
  MOVE   'test_Log.LDF'   TO   'E:\test_Log_bak.LDF'

 

IF EXISTS(SELECT name FROM sysobjects      --判断要创建的存储过程名是否存在
    WHERE name= 'pams_datasafe' AND type= 'P')
DROP PROCEDURE pams_datasafe                    --删除存储过程
GO
                                        --创建存储过程
CREATE PROC pams_datasafe @path_filename char(40)  --建立参数@xb    
AS
BACKUP DATABASE test TO disk = @path_filename  WITH FORMAT, NAME =''
RETURN

 

posted on 2010-01-05 02:36 逍湘 阅读(304) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

留言簿(2)

随笔档案(49)

文章档案(17)

最新随笔

积分与排名

  • 积分 - 25762
  • 排名 - 1500

最新评论

阅读排行榜