《SQL Server 2008 从入门到精通》 学习笔记 第五天

函数

系统函数
创建函数

clip_image002

use SQL2008SBS

go

create function Orders.fn_oldestopenorder()

returns int

as

begin

declare @OrderID int,

@MinOrderDate date

select @MinOrderDate = MIN(OrderDate)

from Orders.OrderHeader

where FinalShipDate is null

select @OrderID = MIN(OrderID)

from Orders.OrderHeader

where OrderDate = @MinOrderDate

return @OrderID

end

go

创建表值函数

use SQL2008SBS

go

create function Orders.fn_openorders(@NumDays int)

returns table

as

return

(select OrderID,CustomerID,OrderDate

from Orders.OrderHeader

where OrderDate<=DATEADD(dd,@NumDays,Getdate())

and FinalShipDate is null)

go

clip_image004

use SQL2008SBS

go

--创建多语句表值函数

create function Orders.fn_openshippableorders(@NumDays int)

returns @ShippableOrders table

(OrderID int not null,

CustomerId int not null,

OrderDate date not null)

as

begin

declare @OpenOrders Table

(OrderID int not null,

CustomerID int not null,

OrderDate date not null)

insert into @OpenOrders

(OrderID,CustomerID,OrderDate)

select a.OrderID,a.CustomerID,a.OrderDate

from @OpenOrders a inner join

(select OrderId from Orders.OrderDetail

except

select OrderID from Orders.OrderDetail c

inner join Products.ProductOptions d on c.SKU = d.SKU

inner join Products.ProductInventory e on d.ProductID = e.ProductID

where c.Quantity > = e.Quantity

) b on a.OrderID = b.OrderID

return

end

go

从函数中获取数据

use SQL2008SBS

go

--从函数中获取数据

--查看Order.OrderHeader表内容

select OrderID,CustomerID,OrderDate

from Orders.OrderHeader

go

--查看Orders.OrderDetail表内容

select OrderID,OrderDetailID,SKU,Quantity

from Orders.OrderDetail

go

--查看数据库个sku数量

select *

from Products.ProductOptions a inner join Products.ProductInventory b

on a.ProductID = b.ProductID

go

--执行下列代码,从之前所创建的标量函数中获取结果

select Orders.fn_oldestopenorder()

go

--执行下列代码以查看一条之前的打开的订单

select * from Orders.fn_openorders(1)

go

--执行下列代码以查看天以前打开的订单

select * from Orders.fn_openorders(5)

修改可编程对象

use SQL2008SBS

go

--执行代码修改Oders.fn_openorders函数

alter function Orders.fn_openorders(@NumDays int)

returns table

as

return

(select OrderID,CustomerID,OrderDate

from Orders.OrderHeader

where OrderDate <= DATEADD(dd,-@NumDays,getdate())

and FinalShipDate is null)

go

--执行修改后的函数,查看一天前打开的订单

select * from Orders.fn_openorders(1)

go

--执行下列代码以查看5天前打开的订单

select * from Orders.fn_openorders(5)

go

--执行查看天前打开的,且已经可以运送的订单

select * from Orders.fn_openshippableorders(3)

go

--执行查看天前打开的,且已经可以运送的订单

select * from Orders.fn_openshippableorders(5)

go

--修改ProductID 2产品的现有库存,从而使得部分订单的产品库存数量达不到要求

update Products.ProductInventory set Quantity = 15 where ProductID = 2

go

--执行下列代码以查看天前打开的,且已经可以运送的订单

select * from Orders.fn_openshippableorders(3)

go

--执行下列代码以查看天前打开的,且已经可以运送的订单

select * from Orders.fn_openshippableorders(5)

go

执行函数

在select,from或select语句的where

或check/default约束中使用函数

确保函数中不删除依赖对象

指定SCHEMABINDING选项

如果传递NULL参数则不执行函数

指定RETURNS NULL ON NULL INPUT选项

修改函数执行的安全上下文

指定EXECUTE AS 子句

触发器

DML触发器

创建一个DML触发器

use SQL2008SBSFS

go

--创建一个DML触发器

create trigger tiu_productdocuments on Products.ProductDocument

for insert,update

as

if exists (select 1 from SQL2008SBS.Products.Product a

inner join inserted b on a.ProductID = b.ProductID)

begin

return

end

else

begin

rollback transaction

raiserror('Violation of foreign key',16,1)

end

go

use SQL2008SBS

go

create trigger td_product on Products.Product

for delete

as

if exists(select 1 from SQL2008SBSFS.Products.ProductDocument a

inner join deleted b on a.ProductID = b.ProductID)

begin

rollback transaction

raiserror('You must first delete all documents for this product',16,1)

end

else

begin

return

end

go

--测试触发器

use SQL2008SBSFS

go

--.....

DDL触发器

创建一个数据库级别的DDL触发器

clip_image006

use SQL2008SBS

go

--创建一个数据库级别的DDL触发器

create trigger tddl_preventdrop

on database

for DROP_TABLE

as

print 'Please disable DDL trigger before dropping tables'

rollback transaction

go

创建一个实例级别的DDL触发器

clip_image008

use SQL2008SBS

go

create trigger tddl_limitconnections

on all server

for LOGON

as

begin

if (select COUNT(*) from sys.dm_exec_sessions

where is_user_process = 1 and

login_name = SUSER_SNAME())>5

print 'You are only allowed a maximu of 5 concurrent connection'

rollback

end

go

--创建个以上的并发连接验证触发器

DML命令执行时运行代码

创建一个DML触发器

DDL命令执行时运行代码

创建一个DDL触发器

数据库快照

Service Broker

全文索引

原文地址:https://www.cnblogs.com/cyehu/p/2335894.html