2013年9月10日星期二

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代表影响的行数。

MongoDB学习(翻译2) - JeremyZhang  阅读原文»

C#驱动之LINQ教程

介绍

本教程涵盖了1.8发布版本对linq查询的支持。

开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍

快速开始

首先,添加下面命名空间到您的程序中:

using MongoDB.Driver.Linq;

然后,声明一变量保存对集合的引用

var collection = database.GetCollection<TDocument>("collectionname");

最基本调用linq查询的方式是构造一个集合变量,通过调用AsQueryable<TDocument>() 后,你便可以正常调用linq了。

实例:

var query =

from e in collection.AsQueryable<Employee>()

where e.FirstName == "John"

select e;



foreach (var employee in query)

{

// do something

}

当然,你也可以通过lambda语法写查询表达式,先前的查询语句等同于下面的写法:

var query =

collection.AsQueryable
<Employee>()

.Where(e
=> e.FirstName == "John");

C#编译器会在内部把所有查询翻译为lambda句法,所以这两种写法没有优略之分,当你需要的时候(比如某些查询操作符不被支持的时候),你甚至可以混用这两种方式。

本教程实例中所有代码均会展示linq查询表达式和lamdba表达式(在查询操作符被支持的前提下).

只有linq查询可以转化为相应的MongoDB查询时该查询才会被支持解析,如果你写的linq查询不能被转化成相应的MongoDB查询,那么您的程序会在产生异常或者错误。

支持的LINQ查询操作符

本节介绍支持的LINQ查询操作符。

  • Any

不含谓词的Any只是测试集合中是否存在any文档对象(any直接引用过来,大家都明白)

var result =

(
from c in collection.AsQueryable<C>()

select c)

.Any();

// 或者

var result =

collection.AsQueryable
<C>()

.Any();

  • Any (含谓词)

含有谓词的Any用来测试集合中是否存在匹配的文档,匹配逻辑在谓词中

var result =

(
from c in collection.AsQueryable<C>()

select c)

.Any(c
=> c.X == 1);

// or

var result =

collection.AsQueryable
<C>()

.Any(c
=> c.X == 1);

投影操作后,带有谓词的Any是不被支持的(至少当前版本),所以下面代码是不可用的。

var result =

collection.AsQueryable
<C>()

.Select(c
=> c.X)

.Any(x
=> x == 1);

通常来说,你可以使用where字句来替代投影操作,这样你可以移除投影操作。

  • Count

不带谓词的Count只是返回文档对象在集合中数量。

var result =

(
from c in collection.AsQueryable<C>()

select c)

.Count();

// 或者

var result =

collection.AsQueryable
<C>()

.Count();

  • Count (带谓词)

带有谓词的Count返回谓词匹配的文档数量。

var result =

(
from c in collection.AsQueryable<C>()

select c)

.Count(c
=> c.X == 1);

// or

var result =

collection.AsQueryable
<C>()

.Count(c
=> c.X == 1);

说明:谓词同样可以通过where字句和不带谓词的Count替代,所以上面实例也可以这样写:

var result =

(
from c in collection.AsQueryable<C>()

where c.X == 1

select c)

.Count();

// or

var result =

collection.AsQueryable
<C>()

.Where(c
=> c.X == 1阅读更多内容

没有评论:

发表评论