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

 

存储过程

  存储过程的优点

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110015.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月26日 上午7:00
下一篇 2021年8月26日 上午7:00


相关推荐

  • 数据库课程设计实验报告–图书馆管理系统

    数据库课程设计实验报告–图书馆管理系统一、系统平台开发工具:EclipsejavaMars数据库MySQLserver,Navicat可视化工具操作系统:win10百度云链接:https://pan.baidu.com/s/1SIWR75NRIh8sSL0oV7uZgA提取码:4y44二、数据库规划1.任务陈述:图书馆信息管理系统数据库用以收集、存储书籍信息、人员(读者、图书管理员…

    2022年5月20日
    57
  • influxdb基本操作_一个数据库只有一个内模式

    influxdb基本操作_一个数据库只有一个内模式安装aptinstallinfluxdbinfluxdb-client<ip>:8083#web<ip>:8086#httpapi复制代码influxDB中独有的一些概念Point由时间戳(time)、数据(field)和标签(tags)组成time:每条数据记录的时间,也是数据库自动生成的主索引fields:各种记录的值…

    2025年6月20日
    6
  • 为什么香港服务器可以免备案

    为什么香港服务器可以免备案呢?这可能是许多朋友都回答不上来的话题,即使是经常使用香港服务器的用户也有部分人不清楚,那么今天我们就聊聊为什么香港服务器可以免备案:众所周知,我们国家实行的一国两制,所以香港地区在管理制度方面会和我们国内的不太一样,不仅是管理制度,包括法律,互联网使用规则也不一样。在国内,根据我国的互联网规定,网站所有者必须向国家有关部门申请实名备案,甚至部分网站还需要完成公安部备案,才能正常使用域名访问网站,且国内为净化互联网,也对许多内容进行限制;而香港则没有必须申请备案的要求,只要网站

    2022年4月8日
    72
  • zTree实现节点修改的实时刷新

    zTree实现节点修改的实时刷新一 应用场景在实际应用中会遇到动态操作树各节点的需求 在增加树节点后如何实时动态刷新树就十分有必要了 二 项目实践比如要在 test1234 节点下新建子节点 首先要选中 test1234 节点 添加成功后 根据 test1234 结点的 TID 去后台请求对应子节点数据 实现动态刷新 删除节点类似 三 代码实现 1 初始化时必须设置配置 lt spanstyle fo

    2026年3月18日
    2
  • Java数组的三种打印方式

    Java数组的三种打印方式1.数组的输出的三种方式一维数组:定义一个数组int[]array={1,2,3,4,5};(1)传统的for循环方式for(inti=0;i<array.length;i++){System.out.println(array[i]);}(2)foreach循环for(inta:array)System.out…

    2022年4月27日
    45
  • Mysql命令_MySQL alter

    Mysql命令_MySQL alter基于Mysql5.7版本的explain参数详解…Mysql官网相关参数解读一:idSELECT标识符1.id越大越先执行2.相同id,从从往下执行二:select_type1.SIMPLE:最简单的查询(没有关联查询没有子查询没有union的查询语句)2:PRIMARY:子查询最外层的查询语句3.SUBQUERY:子查询内层查询语句4.DERIVED:派生表查询,FROM后的不是表而是查询后的结果集5.UNION:union或unionall中的第二个以后的查询表6.U

    2025年12月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号