触发器

  触发器的基础知识

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

存储过程

  存储过程的优点

    A、 存储过程允许标准组件式编程

    B、 存储过程能够实现较快的执行速度

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

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

  存储过程的实例

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之前定义临时表

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

SQL知识整理一:触发器、存储过程、表变量、临时表的更多相关文章

  1. SQL Server 2008 表变量 临时表

    最近做一个报表,其中 在报表中用到了存储过程,游标,cte表达式,临时表和表变量. 在游标中循环遍历cte中的数据,把对应的数据存放在变量里面,之后把变量插入到表变量中,游标结束后,想要根据存储过程的 ...

  2. 存储过程--表变量和while简单运用

    1.sql创建表/*订单*/CREATE TABLE Orders ( PRIMARY KEY(Id), Id int, Name varchar(20))2.存储过程ProTestDT    1)创 ...

  3. SQL知识整理三:变量、全局变量、视图、事务、异常

           变量 1.局部变量的声明(一个@) declare @n int   --声明变量关键字为declare 然后@加变量名 后面是变量类型 declare @s varchar(36) 2 ...

  4. 16、SQL基础整理(触发器.方便备份)

    触发器(方便备份) 本质上还是一个存储过程,只不过不是通过exec来调用执行,而是通过增删改数据库的操作来执行(可以操作视图) 全部禁用触发器 alter table teacher disable ...

  5. SQL知识整理二:锁、游标、索引

    锁 锁的模式 锁模式 描述 共享(S) 用于不更改或不更新数据(只读操作),如SELECT语句 更新(U) 用于可更新的资源中.防止当多个会话在读取.锁定以及随后可能进行的资源更新时发生常见形式的死锁 ...

  6. SQL Server中的临时表和表变量 Declare @Tablename Table

    在SQL Server的性能调优中,有一个不可比面的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集?表变量和临时表是两种选择.记得在给一家国内首屈一指的海运公司作SQL Se ...

  7. SQL Server中的临时表和表变量

    SQL Server中的临时表和表变量 作者:DrillChina出处:blog2008-07-08 10:05 在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的 ...

  8. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  9. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

随机推荐

  1. CSS4

    1.处理溢出(overflow) overflow的取值可以是visible.hidden,scroll,auto,其中visible是默认值.visible表示不裁剪内容,也不添加滚动条,强制显示元 ...

  2. RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)

    RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(MVC版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之产品管理 ...

  3. 使用Flexible适配移动端html页面 - demo记录

    前段时间看了大神的博客文章[使用Flexible实现手淘H5页面的终端适配](地址:http://www.w3cplus.com/mobile/lib-flexible-for-html5-layou ...

  4. 设计模式学习笔记c++版——单例模式

    特别注意单例模式c++实现在main.cpp中引用的时候要去申明下: Singleton * Singleton::m_Instance = NULL; //定义性声明 不然会报错:无法解析的外部符号 ...

  5. internet选项菜单灰色

    HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer”下,然后在“Internet Explorer”上单击右键,在选择“删除”.

  6. C++之检测文件结尾

    当使用文件作为输入流时,为了确保适时的结束文件读取操作,程序要靠检查文件尾来判断该何时停止读取.常用的检查文件尾方法有两种: 两种方式均已将 fin 与文件关联,即 均已声明 fin 输入流,并已调用 ...

  7. HTML5&CSS3练习笔记(二)

    HTML5&CSS3  练习CSS3伪选择器使用 1.first-line  格式:元素:first-line 说明:设置同一个标签下所有行内容的第一行的样式,例如: <table st ...

  8. Objective-C基础3

    1.OC内存管理 1)范围:管理任何继承NSObject的对象,对其他的基本数据类型无效(堆区),否则会造成内存泄露 2)原理:任何对象都可能有用一个或多个所有者,只要一个对象至少还拥有一个所有者,它 ...

  9. python之haproxy配置文件操作(第三天)

    作业: 对haproxy配置文件进行操作 要求: 对haproxy配置文件中backend下的server实现增删改查的功能 一.这个程序有二个版本 1. python2.7版本见haproxy_py ...

  10. linux复制指定目录下的全部文件到另一个目录中

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...