SQL Server 语法

--SQL Server数据库管理和查询--

 

--第一章SQL Server数据库基础

 

--一、数据库的基本概念

 

--1、实体:是所有客观存在的,可以被描述的事物

 

--2、数据库就是表的集合

 

--3、数据库管理系统(DBMS)

 

--4、数据库系统(DBS)

 

--5、数据库管理员(DBA)

 

--6、数据冗余:就是数据重复的现象,减少数据冗余的方法是分类存储,允许有必要的冗余,但要保证数据的完整性。

 

--二、SQL Server管理器

 

--1、数据库按用途可以分为:系统数据库和用户数据库

 

--2SQL Server提供了四个数据库:

--2.1Master:记录SQL Server系统所有的信息.

--2.2Tempdb:保存所有的临时表和临时存储过程,以及临时生成的工作表。

--2.3Model:在系统上创建所有数据库模板。

--2.4Msdb:供SQL Server代理程序调度警报、作业以及记录操作时使用

 

--3SQL Server支持一下两种身份验证:

   ---3.1Windows身份验证。

   ---3.2SQL Server身份验证

 

--三、创建和管理SQL Server数据库

 

--1、数据库包含一个数据库文件和一个日志文件

 

--2、主数据库的扩展名为“.mdf

 

--3、日志文件的扩展名为“.ldf

 

--4、创建数据库看不见,可以右键单击“刷新”

 

--5、数据库只能是“分离”、“附加”和“收缩”

 

--6、数据库一旦删除,将永远不存在

 

 

 

--第二章数据库表管理

 

--一、数据完整性:检验每行数据是否符合要求和检验每列数据是否符合要求

 

--1、约束有四种:

 

--1.1、实体完整性约束:要求表中每一行数据都反映不同的实体,不能存在相同的数据行。

 

--1.2、域完整性:给定的列的输入有效

 

--1.3、引用完整性:用来保持白哦之间一定已的关系

 

--二、主键和外键

 

--1、一个表只能有一个主键,主键约束了表中行是唯一的

 

--2、设置主键需要考虑:最少性和稳定性

 

--3、两列或多列组合起来,叫做“组合键”

 

--三、标识列:为自动增长列

 

--四:表之间的关系:主键和外键的关系

 

--五、检查约束:“check”通常和“like”关键字一起使用

 

--六、SQL Server存在五种约束:主键约束、外键约束、检查约束、默认约束和唯一约束

 

 

 

--第三章 SQL Server数据管理

 

 --一、T-SQL组成部分:

 

 --1.1DML(数据操作语言):用来查询、插入、删除和修改数据库中的数据(如:selectinsertdeletupdate)

 

 --1.2DCL(数据控制语言):用来控制数据库的存取许可、存取权限(如:GrantRevoke)

 

 --1.3DDL(数据定义语言):用来建立数据库以及数据库对象的定义等

 

 --二、T-SQL中的条件表达式和逻辑运算符

 

 --1、条件表达式:比较运算符

 

--                            

 

--    =                              等于

--    >                              大于

--    <                              小于

--    >=                            大于等于

--    <=                            小于等于

--    <>                            不等于

--    !                             

 

 

--2、通配符

 

--                                

 

--    ‘—’                             一个字符

--     %                             任意长度的字符串

--    []                             括号中所指定范围内的一个字符

--    [^]                            不在括号中所指定范围内的任意一个字符

 

 

--3、逻辑表达式:

 

--                                      

 

--    And()                         当连个条件为真时才返回true

--    Or()                          其中任意一个返回真就为true

--    Not()                         Not否定条件

 

--    in关键字用来限制范围

--执行顺序:先执行not,然后在执行and,最后执行or

 

 

--二、使用T-SQL插入数据

 

--注意:用“[]”括起来的内容可以省略

 

--、对于插入的值是字符系列的我们用单引号括起来

 

--1、语法:

 

insert into '表名' ['列名'] values('值列表')

 

--2、一次插入多行数据:

 

--语法:

insert '表名' ['列名']

select '...'  union

select '....'  union

select '...' 

--注:最后一条没有关键字"union"

 

--3、通过Insert Select语句将现有表中的数据添加到新表中

 

--语法:

insert into '新表名' ('列名') select '列名' from '源表名'

--如:

insert into Room (Number,Description) select Number,Description from RoomType

 

--注意两点:1、查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致

--          2、新表必须是已经创建好的  

 

--4、通过Select into语句将现有表中的数据添加到新表中

--语法:

  select '列名' into '新表名' from '源表名'

  --注:这里的新表是没有预先创件好的

 

  --5、设置新表的标识列

  --语法:

  select Identity('数据类型','表示种子','表示增长量') as '列名' into '新表' from '源表名'   

 

--二、更新数据

--语法:

    update '表名' set '列名'='更新值' where '更新条件'

    --注:set后面可以有多项,用逗号隔开

   

   

--三、删除数据

--语法:

delete from '表名' [where '条件']

 

--删除数据:

truncate table '表名'

--truncate只删除数据,不会删除表结构

 

 

 

 

--第四章   数据查询

 

--一、T-SQL查询

 

--1select语句查询:

select * ['列名'] [where '条件'] [order by '排序的列名'] [ASC DESC]

--注:order by用来排序的关键字,排序的列名可有多个,用到号分隔,ASC是升序排列,DESC是降序排列

 

 

--2、查询空行或非空行用"is null" 或者"is not null"

--如:

select number from Room where Number is null '' is not null

 

 

--3、查询返回限制行数

--语法:

select top '限制的行数' from '表名'

 

 

--4、按百分比查询

--语法:

select top '限制的行数' percent from '表名'

--percent关键字按百分比查询

 

 

 --二、函数

 

 --1、字符串函数:

 

 --                                                                                                              

 

   charindex                        '用来寻找一个指定的字符串在另一个字符创中的位置'                                  select charindex('accp','myaccp',1)

  

    len                              '返回传递给他的字符长长度'                                                       select LEN('dsfsdfsd')

   

    upper                            '把传递给他的字符串转换城大写'

   

    ltrim                            '清楚字符左边的空格'

   

    rtrim                            '清楚字符右边的空格'

   

    right                            '从字符串右边返回指定数目的字符'                                                  select right('jckncxcx',3)

   

    replace                          '替换一个字符串中的字符'                                                          select replace('dfvsdfsd','vsd','aaa')

   

    stuff                            '在一个字符串中,删除指定长度的字符串,并在该位置插入一个新的字符串'              select stuff('ABCDEFG',2,3,'我的音乐我的世界')

   

 

 

 

--2、日期函数

 

--                                                                                                              

 

     getdate                                          '获取当前的系统日期'                                                 select GETDATE()

    

     dateadd                                          '将指定的数值添加到指定的制定的日期部分后的日期'

    

     datediff                                         '两个日期之间的指定部分的区别'

    

     datename                                         '日其中指定日期部分的字符串形式'

    

     datepart                                         '日其中指定日期部分的证书形式'

    

    

--3、数学函数:

    --                                                                         

   

     abs                         '取数值表达式的绝对值'                               select abs(-43)

    

     ceiling                     '取大于或等于指定数值、表达式的最小整数'             select CEILING(43.5)

    

     floor                       '取小于或等于指定表达式的最大整数'                   select floor(43.5) 

    

     power                       '取数值表达式的冥值'                                 select POWER(2,5)

    

     round                       '取数值表达式四舍五入'      

    

     sign                        '对于正数返回+1,对于负数返回-1,对于0则返回0'

    

     sqrt                        '取浮点表达式的平方根'   

    

    

--4、系统函数

 

     --                                                                         

    

        Count                         '用来转换数据类型'                             select Convert(varchar(5),12345)

       

      Current_User                    '返回当前用户的名字'                           select Current_User

     

      DataLength                      '返回用于指定表达式的字节数'                   select DATALENGTH('中国A联盟')

     

      host_name                       '返回当前用户所登录的计算机名字'               select HOST_NAME()

     

      System_User                     '返回当前所登录的用户名'                      select System_User

     

      User_Name                       '从给定的用户ID返回用户名'                    select USER_NAME(1)

     

     

     

     

     

     

--第五章数据查询

 

--、一、模糊查询

 

--1、使用"Like"关键字,"Like"关键字和通配符一起使用

--如:

select * from Room where Number like '00[^8]'

 

--2、使用"Between"关键字在某个范围内查询

--如:

select * from Room where Number between(111 and 999)

 

 

--3、用"in"关键字范围查询

--如:只能是括号中的其中一个值

select * from room where number in(111,222,333)

 

 

--二、SQL Server中的聚合函数

 

sum          '用于数字类型'

 

avg          '用于数字类型'

 

max          '用于数字、字符和日期类型'

 

min          '用于数字、字符和日期类型'

 

count        '用于数字和字符类型的列'

   

 

--1、分组查询:使用关键字"group by"

 

 

 

 

 

--二、多表连接查询

 

--1、内连接

 

--1.1、在"where"子句中指定连接条件

--语法:

select '多个表的字段' from '要连接查询的多个表的表名(多个表之间用)' where '用逻辑运算符进行多个表之间的查询条件的连接'

 

--1.2、在from中使用"Inner join"

--语法:

select '两表所需字段' from '表名' inner join '表名' on '两表连接条件'

 

 

--2、外联查询

 

--2.1、左外链查询

--语法:

select '左表和右表所需列名' from '左表名' left join '右表名' on '链表连接条件'

 

--2.2、右外链查询

--语法:

select '左表和右表所需列名' from '右表名' right join '左表名' on '链表连接条件'

 

 

---三、完全链接查询

select '两表所需字段' from '表名' full join '表名' on '两表连接条件'

 

 

 

 

 

 

 

 

                                      --SQL Server数据库设计和高级查询

--、第一章数据库的设计

 

--一、数据库设计:数据库设计就是将数据库中的数据对象以及这些数据对象之间的关系,进行规划个结构化的过程。

 

--数据库设计步骤:

--1、收集信息

--2、表示对象

--3、表示每个对象需要存储的信息也就是列名

--4、表示对象之间的关系

 

--二、项目开发步骤:

--1、需求分析:分许客户的业务和数据处理需求

--2、概要设计:绘制数据库模型图,设计人员和客户沟通,确认数据的真确性和完整性以及项目总体结构设计

--3、详细设计:设计数据库和数据库表和项目总体结构详细设计

--4、代码编写

--5、运行测试

--6、使用维护

 

--三、实体之间的关系:一对一、一对多,多对一,多对多

--数据库设计好用三大范式进行审核

--1、第一范式:确保每列的原子性,即每列不可再分

--2、第二范式:在第一范式的基础上,确保表中每列都和主键列相关,不相关的列放入其他表中,一张表只描述一件事情

--3、第三范式:在第二范式的基础上,确保每列都和主键列直接相关

 

 

 

 

--第二章  数据库的实现

 

--1、创建存储路径

--语法:

exec sp_configure 'show advanced option'   '允许配置高级选项'

go

reconfigure '重新配置'

go

exec sp_configure 'xp_cmdshell',1 '0表示禁用'

go

reconfigure '重新配置'

go

exec xp_cmdshell 'mkdir D:\project'   '创建存储数据库的路径和文件夹'

go

exec xp_cmdshell 'D:\'   '查看存放位置'

go

 

 

--一、数据库的创建

--语法:

if exists(select * from sysdatabases where name='数据库名')--判断数据库是否存在

drop database '数据库名'--删除数据库

go

 

create database '数据库名'

on(

name='数据库名',

filename='D:\project\数据库名.mdf',

size='数据库文件的大小',

maxsize='数据库文件的最大值'

filegrowth='数据库文件的增长率'

)

log on

(

name='日志文件名',

filename='D:\project\日志文件名.ldf',

size='日志文件大小',

filegrowth='日志文件增长大小'

)

go

 

 

--举例:

if exists(select * from sysdatabases where name='zxb')

drop database zxb 

go

 

create database zxb

on(

name='zxb',

filename='D:\project\zxb.mdf',

size=10mb,

maxsize=100,

filegrowth=15%

)

log on

(

name='zxblog',

filename='D:\project\zxblog.ldf',

size=2mb,

filegrowth=1mb

)

go

--:数据库文件名不能和日志文件名重名,后面要跟逗号

 

 

--二、创建表和删除表

 

--1、约束分类:主键约束(Primary Key)、唯一约束(Unique)、检查约束(Check)、默认约束(default)、外键约束(Foreign Key)

 

--2、创建表

--语法:

if exists(select * from sysobjects where name='表名')

drop table '表名'--删除表

go

 

create table '表名'

(

'字段1' '数据类型' '是否为空(not null不为空 null为空)'  constraint '约束名' '约束类型'

.............................................................

)

--举例:

if exists(select * from sysobjects where name='zxb')

drop table zxb

go

 

create table zxb

(

zxbid int not null  constraint PK_zxbid primary key(zxbid),

name varchar(20) not null constraint DF_name  default('zxb'),

sex  char(10) not null constraint CK_sex check(sex='' or sex=''),

phone varchar(20) null constraint QU_phone unique(phone),

stuon int not null constraint FK_stuon foreign key(stuon) references stuInfo(stuon)--注:外键约束,stuInfo(stuon)是外键

)

go

 

--3、删除约束

--语法:

alter table zxb

drop constraint FK_stuon

 

 

--三、SQL语句创建登录

 

--登录账户有两种:SQL登录账户和window登录账户

 

--1、创建window登录账户:

--语法:

exec sp_grantlogin 'window域名\域账户'

--如:

exec sp_grantlogin 'jbtraining\s26301'

 

--2SQL登录账户:

--语:

exec sp_addlogin '账户名','密码'

--如:

exec sp_addlogin 'zhangsan','1234'

 

--3、创建数据库用户

--语法:

exec sp_grantdbaccess '登录账户','数据库用户'

--如:

exec sp_grantdbaccess 'zhangsan','zhangsanDBUser'

 

 

--3、给数据库用户授权

--语法:

grant '权限(增、删、改、查)' [on '表名'] to '数据库用户'

 

--4、收回数据库用户权限

--语法:

revoke '权限(增、删、改、查)' [on '表名'] to '数据库用户'

 

 

 

 

 

 

--第三章 T-SQL编程

 

--一、局部变量全局变量:

 

--1、语法:

declare '@变量名' '变量类型'

--如:

declare @name varchar(20)

 

--2、局部变量赋值:

--语法:

set '@变量名'='' 或者 select '@变量名'=''

--如:

set @name='zxb' 或者 select @name='zxb'

--注:select可用以查询语句赋值,但查询的记录只能是一条,如果多于一条,将把最后一条记录的值赋给变量

 

 

--3、全局变量:由系统提供

@@error --记录最后一个T-SQL错误的错误号

@@Identity --最后一次插入的标识值

@@servername --本地服务器的名字

@@servicename --SQL服务的名称

@@transcount --当前链接打开的事物数

@@version --SQL Server版本信息

 

 

 

--二、输出语句:

--语法:

print '服务器名称:'+@@servername

select @@servername as '服务器名称'

 

 

 

--三、逻辑控制语句:

 

--1if条件语句

 

--语法:

if('条件')

   begin

   '语句或语句块'

   end

else

    begin

   '语句或语句块'

   end

   

  

--2while循环语句

--语法:

while('条件')

     begin

     '语句或语句块'

     [ break ]

     end

    

    

--3、多分支语句:

--语法:

case

      when  '条件1'   then  '结果1'

      when  '条件2'   then  '结果2'

      ......

      [ else 其他结果]

end

 

--举例:

select stuNo,成绩=case

                     when  writeEaam<60 then 'E'

                     when  writeEaam between 60 and 69 then 'D'

                     when  writeEaam between 70 and 79 then 'C'

                     when  writeEaam between 80 and 89 then 'B'

                     else 'A'

                  end

            from stuMarks

           

           

--"go"就是批处理语句的标志

 

 

 

 

 

 

--第四章高级查询

 

--一、简单子查询

--语法:

select ... from '1' where '字段1' > ('子查询语句')

 

注:将子查询和比较运算符联合使用,必须保证子查询返回的值不多于一个

 

 

提示:一般来说,表连接可以用子查询来替换,但反过来却不一定。

有的子查询不能用表连接来替换,子查询比较灵活、方便、形式多样,适合于作为子查询的筛选条件。

而表连接跟适合于查看多表的数据。

 

 

 

--二、"in""not in"子查询:

 

--语法:

select ... from '1' where '字段1' in not in ('子查询语句')

 

提示:用于在某一范围内查询值,"in":是包含,"not in":是不包含""in""not in"可以返回多条记录

 

 

 

--三、"exists""not exists"子查询

--:用于判断是否存在,"exists":是存在,"not exists":是不存在

 

 

 

 

 

 

 

--第五章事物、索引和视图

 

--一、事物:

 

--1、事物是单个的工作单元,是一种机制,一个操作序列。

 

--2、事物的四个属性:

原子性:事物是一个完整的操作。

 

一致性:提交完成事物时,数据必须处于一致的状态。

 

数据隔离性:事物是独立的,不依赖于其他事物

 

持久性:数据保存永久性

 

 

--3、创建事物:

--语法:

 

 begin transaction --事物开始

 

commit transaction --事务提交

 

rollback transaction --事物回滚(撤销事物)

 

 

--4、事物分类:显示事物、隐式事物和自动提交事务

 

 

 

--二、索引

 

--索引列创建的条件:该列用于频繁搜索,该列对数据进行排列。

 

--1、索引:索引就是给数据加上标识,查询的时候可以直接找到

 

--2、索引分类:唯一索引(unique)、主键索引(primary key)、聚集索引(clustered)和非聚集索引(nonclustered)

 

--提示:一帮都是用主键索引

--提示:一个标只能建一个聚集索引,但可以有多个非聚集索引,主键列就是聚集索引

 

--3、创建索引

--语法:

if exists(select name from sysindexes where name='索引名')

drop index '索引名'

go

 

create index '索引名'

on '要创建索引的表名('要创建索引的列,可有多列,逗号分隔')'

   [ with fillfactor='填充因子(0100之间)']

 

 

 

 

--三、视图:

--1、视图:是一张虚拟的表,用来作为来自一个或多个表中行或列组成的一张新表

 

--2、创建视图

--语法:

 

if exists(select * from where name='视图名')

drop view '视图名'

go

 

create view '视图名'

  AS

   <select语句>

go

 

--3、查看视图:

--语法:

select * from '视图名'

 

 

--第六章存储过程

 

--一、存储过程:为了完成某一特定那个功能所定义的一组SQL语句

 

--1、分类:系统存储过程、用户自定义存储过程

 

--2、用户自定义存储过程:

 

---语法:

   create procedure '存储过程名'

            declare @参数1   数据类型 [ outpu ]  --注意:这里的参数可以是带输入的参数或者是带输出的参数,只有带

 

输出参数时,才使用关键字"outpu"

            .........

            declare @参数n   数据类型 [ outpu ]

        AS

             SQL语句或者逻辑控制语句或者事物或者索引或者视图等

go

 

--2、存储过程调用

--语法:

  exec '存储过程名' --调用的是不带任何参数的存储过程

 

  exec '存储过程名' '@参数1...' --调用带输入参数的存储过程,多个参数之间用逗号分隔

 

--调用带输出参数的存储过程:

 

   declare @sum int --定义变量,用于存放带哦用存储过程时返回的结果。

 

   exec '存储过程名' @sum otput ,'输入参数' --注意:存储过程内可以同时有输入输出参数。

 

--反复强调,使用输出参数创建存储过程时,在参数后面需要跟"output"关键字,调用存储过程时,在变量后面也要跟"output"

 

关键字

 

 

 

--二、处理错误信息

--语法:

raisserror('参数')

--参数有:

msg_id  --sysmessages系统表中指定的用户定义的错误信息

 

msg_str --用户定义的特定信息,最长255个字符

 

severity --与特定信息相关,表示用户定义的严重性级别,可使用的级别为0181925是为sysadmin固定角色成员预留,20

 

25错误被认为是致命的错误

 

state  --表示错误的状态,1127的值

 

option --是否将错误记录到服务器错误日志文件中

 

--注意:可以综合使用以上参数

 

 

 

 

 

 

  

  

  

SQL触发器:

 

 触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。

 

语法

  CREATE TRIGGER trigger_name

  ON { table | view }

  [ WITH ENCRYPTION ]

  {

  { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }

  [ WITH APPEND ]

  [ NOT FOR REPLICATION ]

  AS

  [ { IF UPDATE ( column )

  [ { AND | OR } UPDATE ( column ) ]

  [ ...n ]

  | IF ( COLUMNS_UPDATED ( ) updated_bitmask )

  column_bitmask [ ...n ]

  } ]

  sql_statement [ ...n ]

  }

  }

  参数

  trigger_name

  是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。

  Table | view

  是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

  WITH ENCRYPTION

  加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。

  AFTER

  指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

  如果仅指定 FOR 关键字,则 AFTER 是默认设置。

  不能在视图上定义 AFTER 触发器。

  INSTEAD OF

  指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

  在表或视图上,每个 INSERTUPDATE DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。

  INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。

  { [DELETE] [,] [INSERT] [,] [UPDATE] }

  是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

  对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。

  WITH APPEND

  指定应该添加现有类型的其它触发器。只有当兼容级别是 65 或更低时,才需要使用该可选子句。如果兼容级别是 70 或更高,则不必使用 WITH APPEND 子句添加现有类型的其它触发器(这是兼容级别设置为 70 或更高的 CREATE TRIGGER 的默认行为)。有关更多信息,请参见 sp_dbcmptlevel

  WITH APPEND 不能与 INSTEAD OF 触发器一起使用,或者,如果显式声明 AFTER 触发器,也不能使用该子句。只有当出于向后兼容而指定 FOR 时(没有 INSTEAD OF AFTER),才能使用 WITH APPEND。以后的版本将不支持 WITH APPEND FOR(将被解释为 AFTER)。

  NOT FOR REPLICATION

  表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

  AS

  是触发器要执行的操作。

  sql_statement

  是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETEINSERT UPDATE 语句是否导致执行触发器操作。

  当尝试 DELETEINSERT UPDATE 操作时,Transact-SQL语句中指定的触发器操作将生效。

  触发器可以包含任意数量和种类的 Transact-SQL 语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的 Transact-SQL 语句常常包含控制流语言。CREATE TRIGGER 语句中使用几个特殊的表:

  * deleted inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用:

  SELECT *

  FROM deleted

  * 如果兼容级别等于 70,那么在 DELETEINSERT UPDATE 触发器中,SQL Server 将不允许引用 inserted deleted 表中的 textntext image 列。不能访问 inserted deleted 表中的 textntext image 值。若要在 INSERT UPDATE 触发器中检索新值,请将 inserted 表与原始更新表联接。当兼容级别是 65 或更低时,对 inserted deleted 表中允许空值的textntext image 列,将返回空值;如果这些列不可为空,则返回零长度字符串。

  当兼容级别是 80 或更高时,SQL Server 允许在表或视图上通过 INSTEAD OF 触发器更新 textntext image 列。

  n

  是表示触发器中可以包含多条 Transact-SQL 语句的占位符。对于 IF UPDATE (column) 语句,可以通过重复 UPDATE (column) 子句包含多列。

  IF UPDATE (column)

  测试在指定的列上进行的 INSERT UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。

  说明 IF UPDATE (column) 子句的功能等同于 IFIF...ELSE WHILE 语句,并且可以使用 BEGIN...END 语句块。有关更多信息,请参见控制流语言。

  可以在触发器主体中的任意位置使用 UPDATE (column)

  column

  是要测试 INSERT UPDATE 操作的列名。该列可以是 SQL Server 支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。

  IF (COLUMNS_UPDATED())

  测试是否插入或更新了提及的列,仅用于 INSERT UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。

  COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。

  可以在触发器主体中的任意位置使用 COLUMNS_UPDATED

  bitwise_operator

  是用于比较运算的位运算符。

  updated_bitmask

  是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1C2C3C4 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2C3 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2

  comparison_operator

  是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。

  column_bitmask

  是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

  注释

  触发器常常用于强制业务规则和数据完整性

 

 

 

 

 

 

 

 

 

posted on 2012-09-21 07:56  紫炎之心  阅读(623)  评论(0)    收藏  举报