SQL知识整理一:触发器、存储过程、表变量、临时表

                                     触发器sql

  触发器的基础知识数据库

create trigger tr_name 
on table/view 
{for | after | instead of } [update][,][insert][,][delete] 
[with encryption] 
as {batch | if update (col_name) [{and|or} update (col_name)] } 

说明:
  1 tr_name :触发器名称
  2 on table/view :触发器所做用的表。一个触发器只能做用于一个表
  3 for 和after :同义
  4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别
    After
      在触发事件发生之后才被激活,只能够创建在表上
    Instead of
      代替了相应的触发事件而被执行,既能够创建在表上也能够创建在视图上
  5 insert、update、delete:激活触发器的三种操做,能够同时执行,也可选其一
  6 if update (col_name):代表所做的操做对指定列是否有影响,有影响,则激活触发器。此外,由于delete 操做只对行有影响,
因此若是使用delete操做就不能用这条语句了(虽然使用也不出错,可是不能激活触发器,没意义)。
  7 触发器执行时用到的两个特殊表:deleted ,inserted
    deleted 和inserted 能够说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器做用的表结构是同样的,只是存放 的数据有差别。
    8 说明deleted 与inserted 数据的差别
    deleted 与inserted 数据的差别
    Inserted 存放进行insert和update 操做后的数据
    Deleted 存放进行delete 和update操做前的数据
    注意:update 操做至关于先进行delete 再进行insert ,因此在进行update操做时,修改前的数据拷贝一条到deleted 表中,修改后的数据在存到触发器做用的表的同时,也同时生成一条拷贝到insered表中编程

 

  触发器典型示例安全

if exists(select name from sysobjects where xtype='tr' and name='tri_updateStudent')
begin
    drop trigger tri_UpdateStudent
end
go
create trigger tri_UpdateStudent
    on dbo.student
    for update
as
    if update(Sage)
    begin
       update student set sage=s.sage+d.sage from student s,deleted d where s.studentid=d.studentid
    end
go

 

存储过程网络

  存储过程的优势 ide

    A、 存储过程容许标准组件式编程函数

    B、 存储过程可以实现较快的执行速度spa

    C、 存储过程减轻网络流量日志

    D、 存储过程可被做为一种安全机制来充分利用code

  存储过程的实例

if exists(select * from sysobjects where xtype='p' and name='proc_Student')

begin 

    drop proc proc_student

end

go

create proc proc_Student

    @name varchar(255),

    @age varchar(255)

as

    begin tran

    select * from student where  sname=@name and sage=@age

    if @@ERROR<>0

       begin

           rollback tran

           insert into student(studentid,sname,sage) values (1,@name,@age)

           return 0

       end

    else

        begin

       commit tran

       select * from student

       end

go

exec proc_student '程兴亮',1;

                                        表变量

  表变量定义:

  表变量建立的语法相似于临时表,区别就在于建立的时候,必需要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户链接中才能够访问。全局的表变量的名称都是以“@@”为前缀,通常都是系统的全局变量,像咱们经常使用到的,如@@Error表明错误的号,@@RowCount表明影响的行数。

DECLARE @News table 

  ( 

  News_id int NOT NULL, 

  NewsTitle varchar(100), 

  NewsContent varchar(2000), 

  NewsDateTime datetime 

  ) 

  INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime) 

  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE()) 

  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News

 

临时表

  临时表定义:

  临时表与永久表类似,只是它的建立是在Tempdb中,它只有在一个数据库链接结束后或者由SQL命令DROP掉,才会消失,不然就会一直存在。临时表在建立的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。

  临时表分为本地和全局两种,本地临时表的名称都是以“#”为前缀,只有在本地当前的用户链接中才是可见的,当用户从实例断开链接时被删除。全局临时表的名称都是以“##”为前缀,建立后对任何用户都是可见的,当全部引用该表的用户断开链接时被删除

CREATE TABLE dbo.#News 
  ( 
  News_id int NOT NULL, 
  NewsTitle varchar(100), 
  NewsContent varchar(2000), 
  NewsDateTime datetime 
  ) 
  INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime) 
  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE()) 
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News 
  DROP TABLE dbo.[#News]

  表变量和临时表对比总结

特性

表变量

临时表

做用域

当前批处理

当前会话,嵌套存储过程,全局:全部会话

使用场景

自定义函数,存储过程,批处理

自定义函数,存储过程,批处理

建立方式

DECLARE statement only.只能经过DECLEARE语句建立

CREATE TABLE 语句

SELECT INTO 语句.

表名长度

最多128字节

最多116字节

列类型

可使用自定义数据类型

可使用XML集合

自定义数据类型和XML集合必须在TempDb内定义

Collation

字符串排序规则继承自当前数据库

字符串排序规则继承自TempDb数据库

索引

索引必须在表定义时创建

索引能够在表建立后创建

约束

PRIMARY KEY, UNIQUE, NULL, CHECK约束可使用,但必须在表创建时声明

PRIMARY KEY, UNIQUE, NULL, CHECK. 约束可使用,能够在任什么时候后添加,但不能有外键约束

表创建后使用DDL (索引,列)

不容许

容许.

数据插入方式

INSERT 语句 (SQL 2000: 不能使用INSERT/EXEC).

INSERT 语句, 包括 INSERT/EXEC.

SELECT INTO 语句.

Insert explicit values into identity   columns (SET IDENTITY_INSERT).

不支持SET IDENTITY_INSERT语句

支持SET IDENTITY_INSERT语句

Truncate table

不容许

容许

析构方式

批处理结束后自动析构

显式调用 DROP TABLE 语句.
  当前会话结束自动析构 (全局临时表: 还包括当其它会话语句不在引用表.)

事务

只会在更新表的时候有事务,持续时间比临时表短

正常的事务长度,比表变量长

存储过程重编译

会致使重编译

回滚

不会被回滚影响

会被回滚影响

统计数据

不建立统计数据,因此全部的估计行数都为1,因此生成执行计划会不精准

建立统计数据,经过实际的行数生成执行计划。

做为参数传入存储过程

仅仅在SQL Server2008, 而且必须预约义   user-defined table type.

不容许

显式命名对象 (索引, 约束).

不容许

容许,可是要注意多用户的问题

动态SQL

必须在动态SQL中定义表变量

能够在调用动态SQL以前定义临时表

   用法:无表关联操做,只做为中间集进行数据处理,建议用表变量;有表关联,且不能肯定数据量大小的状况下,建议用临时表。

相关文章
相关标签/搜索