SQLServer存储过程、自定义函数、视图语法
一、存储过程
1.存储过程的主框架
drop proc SP_TRAACC_DERTOOLCPTRADE ;
CREATE procedure dbo.SP_TRAACC_DERTOOLCPTRADE(
@etldate varchar(20)
)
AS
/**-------存储过程日志所需变量---------------------------------*/
DECLARE @v_prcname VARCHAR(100) = 'SP_TRAACC_DERTOOLCPTRADE'; --记录存储过程名称
DECLARE @v_step VARCHAR(200) = '1'; --运行步骤
DECLARE @v_date VARCHAR(10); --数据日期
DECLARE @start_time VARCHAR(10); --脚本运行开始时间
DECLARE @return_code VARCHAR(100); --运行结果状态信息
DECLARE @rtcode varchar(4) = '0';
BEGIN
begin TRAN
BEGIN try
SELECT @start_time=CONVERT(varchar,getdate(),24);
SELECT @v_date=CONVERT(varchar,@etldate,112);
delete from LES_GC_CpProcParaInfo where datadate = @etldate;
COMMIT TRAN;
set @rtcode = '0';
set @return_code ='Success';
end try
/***************************本脚本运行失败,异常处理************************************************/
begin catch
IF(@@ERROR <> 0)
set @rtcode = @@ERROR;
rollback TRAN;
--RETURN
end catch
return @rtcode
END
2.存储过程的语法
2.1变量的声明
变量的声明:声明变量时必须在变量前加@符号 DECLARE @I INT
变量的赋值: 变量赋值时变量前必须加set set @rtcode = ‘0’
声明多个变量: DECLARE @s varchar(10),@a INT
2.2.变量的赋值
使用select语句赋值 赋常量值 select @user1=‘张三’
查询赋值: SELECT @start_time=CONVERT(varchar,getdate(),24
使用update语句赋值 update ST_User set @user3 = Name where ID=1
2.3.变量打印
变量打印 print @a
2.4 循环语句
while @a<=100
begin
set @sum+=@a
set @a+=1
end
2.5 条件语句:
if(1+1=2)
begin
print ‘对’
end
else
begin
print ‘错’
end
2.6 when then条件分支
set @week=case
when @today=1 then ‘星期一’
when @today=2 then ‘星期二’
else ‘值错误’
end
2.7 异常处理
begin catch
IF(@@ERROR <> 0)
set @rtcode = @@ERROR;
rollback TRAN;
end catch
二、自定义函数
1.自定义函数写法参考:
CREATE FUNCTION dbo.Test(
@var1 AS DECIMAL(38,10)
)
RETURNS DECIMAL(38,10)
AS
BEGIN
DECLARE @var2 DECIMAL(38,10)
if @var1 >6
set @var2 = 1;
else
set @var2 = 0 ;
return @var2
END
2.一个标准正态分布函数的实现
CREATE FUNCTION dbo.NormSDist(
@var1 AS DECIMAL(38,10)
)
RETURNS DECIMAL(38,10)
AS
BEGIN
DECLARE @var2 DECIMAL(38,10)
DECLARE @gamma DECIMAL(38,10)
DECLARE @a1 DECIMAL(38,10)
DECLARE @a2 DECIMAL(38,10)
DECLARE @a3 DECIMAL(38,10)
DECLARE @a4 DECIMAL(38,10)
DECLARE @a5 DECIMAL(38,10)
DECLARE @x DECIMAL(38,10)
DECLARE @t DECIMAL(38,10)
DECLARE @n DECIMAL(38,10)
if @var1 >6
set @var2 = 1;
if @var1 <-6
set @var2 = 0
set @gamma = 0.231641900
set @a1 = 0.319381530
set @a2 = -0.356563782
set @a3 = 1.781477973
set @a4 = -1.821255978
set @a5 = 1.330274429
set @x=abs(@var1)
set @t = 1 / (1 + @gamma*@x)
set @n = 1 - (1 / (SQRT(2 * PI())) * exp(-@var1*@var1 / 2))
*(@a1 * @t + @a2 * power(@t, 2) + @a3 * power(@t, 3) + @a4
* power(@t, 4) + @a5 * power(@t, 5))
if @var1<0
set @var2 = 1.0 -@n
else
set @var2 = @n ;
return @var2
END
三、游标
游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。用白话文讲,就是如果我们需要操作查询结果集中的每一条记录时要是用游标。
具体的代码案例如下:
–创建一个游标
declare my_cursor cursor for --my_cursor为游标的名称,随便起
select id,name from my_user --这是游标my_cursor的值,这里随便发挥看业务场景
–打开游标
open my_cursor --没什么好说的
–变量
declare @id int --声明变量 ‘declare’为声明变量 ‘@name’为变量名称 后面为变量类型
declare @name varchar(50) --这里是两个变量用来接收游标的值
–循环游标
fetch next from my_cursor into @id,@name --获取my_cursor的下一条数据,其中为两个字段分别赋值给@id,@name
while @@FETCH_STATUS=0 --假如检索到了数据继续执行
begin
print(@name) --print()打印变量 随便发挥
select * from my_user where id=@id --这里是具体业务了,随便发挥。而我这是又执行了一次查询
fetch next from my_cursor into @id,@name --获取下一条数据并赋值给变量
end–关闭释放游标
close my_cursor
deallocate my_cursor --摧毁游标
四、触发器
1.触发器的概念:
触发器是一种特殊的存储过程,它被分配给某个特定的表。当对这个表进行插入、更新或删除操作时, 自动调用触发器执行触发器里规定的操作.
触发器是确保数据完整性和一致性的基本有效的方法。
和表相关联,可以看作是表的一部分;
不能直接引用,通过insert/update/delete自动激活;
属于事务机制;
同一类型的触发器在表上可以有多个
2.触发器的特点:
不接受用户参数,也不返回用户参数;
事件驱动,自动调用;存储在表上。
对数据库中的相关表进行级联更新和删除
强制比Check约束更复杂的数据完整性。
可以引用其他表中的列。
3触发器的种类:
- 插入型触发器
- 删除型触发器
- 更新型触发器
一个表上可以定义多种类型的触发器
4.触发器的工作原理:
SQL Server创建了两个专用表:inserted表和deleted表。这是两个逻辑表,由系统来维护,不允许用户直接对这两个表进行修改。它们存放于内存中,不存放 在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。
Inserted :存放由于INSERT或UPDATE语句的执行而导致要加到该触发表中去的所有新行。即用于插入或更新表的新行值,在插入或更新表的同时,也将其副本存入insterted表中。因此,在insterted表中的行总是与触发表中的新行相同 。
deleted :deleted存放由于DELETE或UPDATE语句的执行而导致要从该触发表中删除的所有行。也就是说,把触发表中要删除或要更新的旧行移到deleted表中。因此,deleted表和触发表不会有相同的行。
5触发器的工作方式:
它们存放在内存中,不存放在数据库中。
当向表中插入数据时,insert触发器触发执行,新的记录插入到触发器表和inserted表中。 当触发一个delete触发器时,被删除的表记录存放到deleted表中。修改一条记录等于插入一条新记录,同时删除旧记录,表中原始记录放在deleted中,修改过的记录插入到inserted表中。
6 创建触发器:
- 语法:
create trigger 触发器名
on 表名
for delete /insert /update
as 触发器要执行的操作 - 创建插入型触发器:
–在users表中定义触发器,当插入纪录时弹出消息:你已经向users表里插入了一条纪录!
create trigger t_users
on users
for insert
as
print ‘已向users表里插入了一条记录’
Go
- 创建Delete触发器:
--在users表中定义触发器,当删除纪录时弹出消息:你已经向users表里删除了一条纪录!
create trigger t_users
on users
for delete
as
print ‘你已经删除了此数据’
go
- 创建Updata触发器:
如果在xs表中更新数据,则在执行时显示提示信息。
create trigger tr_update
on users
for update
as
print ‘你已经更新了此数据!’
go
- 修改、删除触发器:
修改语法:
alter trigger 触发器名
on 表名
for delete /insert /update
as 触发器要执行的操作
删除语法:
drop trigger 触发器名 - 禁用、启用触发器:
禁用语法:
Alter table 表名
disable trigger 触发器名
启用语法:
Alter table 表名
enable trigger 触发器名 - 使用触发器时应考虑的因素:
首先检查约束。如果在触发器表上存在约束,则约束在 触发器执行前检查。如果违反约束,触发器就不执行。对任何动作都可以有多个触发器。允许在一个表上嵌套几个触发器。一个表可以定义多个触发器。每个触发器可以为一个或几个动作定义