(2.2)DDL增强功能-自定义函数与存储过程
关键词:sql server存储过程,sql server表值函数
目录
1.存储过程
SET XACT_ABORT ON
基本形式与演示
2.自定义函数/表值函数
3.存储过程的特性
4.函数特性
5、设置存储过程在实例启动时启动
6、事务控制,自定义错误:https://www.cnblogs.com/gered/p/8746008.html
1.存储过程
精华总结:
通过对比@@ERROR一般和if判断结合使用,@@TRANCOUNT和try catch块结合使用,xact_abort为on可以单独使用
Xact_abort为off时,如果存在事务嵌套可以和保存点结合使用
1.1 SET XACT_ABORT ON是设置事务回滚的!
为OFF时,只回滚错误的地方。事务内剩余的语句都会执行;
在存储过程中使用事务时,如果存在try…catch语句块,那么当捕获到错误时,需要在catch语句块中手动进行Rollback操作,否则系统会给客户端传递一条错误信息。
(1)基本形式
- create proc | procedure pro_name
- [{@参数数据类型} [=默认值] [output], --加上output就代表是地址传递(即会从调用接收,也会输出给调用)
- {@参数数据类型} [=默认值] [output],
- ....
- ]
- as
- SQL_statements
(2)实例演示
--判断过程是否存在
IF OBJECT_ID('getArea') is not null
BEGIN
drop procedure getArea
END
GO --创建存储过程
create procedure getArea
@shopId nvarchar(64) ,
@area nvarchar(32) output
as
begin
print @area
if (@shopId is not null and @shopId <> '')
begin
select @area= 2
end
else
begin
set @area = '空'
end
end
GO
--声明变量
declare @a varchar(20);
set @a=''
--执行存储过程
execute getArea '', @a output; --规范形式,形参实参一一对应
execute getArea @shopId='2010315',
@area=@a output;
--输出验证结果
print @a ;
GO
在存储过程中,使用自定义类型(表类型,2008及以上才支持),作为存储过程的参数的应用
/* 创建表类型.*/
create type Type_test as table(keyId int,info varchar(30));
go
/* 创建一个存储过程以表值参数作为输入 */
create Procedure pr_testTable(@tmp Type_test readonly)
as
select *,getdate() from @tmp;
go /* 声明表值参数变量.*/
declare @tmp as Type_test;
/*对自定义类型进行数据插入*/
insert into @tmp(keyId,info)
values(10,'test'),(20,'maomao365.com'),(30,'猫猫小屋') /* 存储过程运行表参数*/
exec pr_testTable @tmp;
go drop proc pr_testTable
go
drop type Type_test
go
2.自定义函数
【2.1】常规自定义函数
--创建
--(1)直接返回表类型
IF OBJECT_ID('testFunTable') is not null
drop function testFunTable
go
create function testFunTable(@count int)
returns @temptale table (intcount int ,intcountAdd int)
as
begin
insert into @temptale values(@count,@count+1)
return
end
GO
--调用
SELECT * FROM dbo.testFunTable(20)
GO --(2)直接返回数字
IF OBJECT_ID('testFunTable') is not null
drop function testFunTable
go
create function testFunTable(@count int)
returns int
as
begin
return @count+1
end
GO
--调用
SELECT dbo.testFunTable(20)
【2.2】表值函数
有些情况可能用下表值函数,表值函数主要用于数据计算出来返回结果集,可以带参数(和视图的一个大的区别),如果函数中没有过多的逻辑处理,如变量的定义,判断等,
表值函数返回结果集可以简单向下面这么写: CREATE FUNCTION Fun_GetReportNews(@type varchar(10))
RETURNS TABLE
AS
RETURN
(
SELECT TPR_ID,TPR_Title,TPR_Date FROM TP_ReportNews WHERE TPR_Type = @type
) 调用的时候就 SELECT XX FROM Fun_GetReprotNews('xx') 如果函数中要定义变量,进行判断计算处理什么的,写法有点不一样了,要定义表变量才行,表值函数里是不允许创建临时表的,只能是表变量。
举个简单的写法样式,如下: CREATE FUNCTION FUN_GetInfoList(@type varchar(10))
RETURNS @Table TABLE(TPR_ID int,TPR_Title nvarchar(100),TPR_PubDate datetime)
AS
BEGIN
DECLARE @a varchar(10)
SELECT @a = xx FROM XX WHERE xx = @type
INSERT @Table SELECT XX,XX,XX FROM TableName WHERE XX = @a --表变量里定义的列数和取值列数要一致
RETURN
END
3.存储过程的特性
(1)SP中创建临时表,SP结束后临时表被销毁
(2)SP不能返回表变量,但限制少,可以执行对数据库表的操作,可以返回数据集
(3)限制少,可以执行对数据库表的操作,可以返回数据集
(4)可以return一个标量值,也可以省略return
存储过程一般用在实现复杂的功能,数据操纵方面
4.函数特性
(1)函数中不能用某些DML(select,update,delete)语句
(2)函数中不能用print与output
(3)函数中不能使用临时表
(4)可以返回表变量
(5)内部操作不影响外部
自定义函数一般用在复用度高,功能简单单一,争对性强的地方。 5、设置存储过程在实例启动时启动
--将该存储过程设置为SQL Server服务启动时自动启动
EXEC sp_procoption
'StartBlackBoxTrace','STARTUP','ON'
print 'ok'
GO

部分参考自:https://www.cnblogs.com/chaoa/articles/3894311.html
(2.2)DDL增强功能-自定义函数与存储过程的更多相关文章
- MySQL自定义函数与存储过程
1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+---- ...
- MySQL自定义函数和存储过程的区别:
自定义函数和存储过程的区别: 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.存储过程,功能强大,可以执行包括修改表等一系列数据库操作:用户定义函数不能用于执行一组修改全局 ...
- sqlserver自定义函数与存储过程的区别 实例详解
分享下sql server自定义函数与存储过程的区别,一起来学习下. 一.自定义函数: 1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数: 不能用临时表: 函数内部的操作不能影响到 ...
- mysql创建自定义函数与存储过程
mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...
- MySQL自定义函数与存储过程的创建、使用、删除
前言 日常开发中,可能会用到数据库的自定义函数/存储过程,本文记录MySQL对自定义函数与存储过程的创建.使用.删除的使用 通用语法 事实上,可以认为存储过程就是没有返回值的函数,创建/使用/删除都非 ...
- MYSQL数据库重点:自定义函数、存储过程、触发器、事件、视图
一.自定义函数 mysql自定义函数就是实现程序员需要sql逻辑处理,参数是IN参数,含有RETURNS字句用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句. 语法: 创建: ...
- Oracle自定义函数和存储过程示例,自定义函数与存储过程区别
参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...
- (2.1)DDL增强功能-数据类型、同义词、分区表
1.数据类型 (1)常用数据类型 1.整数类型 int 存储范围是-2,147,483,648到2,147,483,647之间的整数,主键列常设置此类型. (每个数值占用 4字节) smallint ...
- (2.5)DDL增强功能-触发器trigger
SQL Server:触发器详解 1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. ...
随机推荐
- 使用定时器判断确保某个标签有值才执行方法, 控制js代码执行先后顺序
使用定时器判断确保某个标签有值才执行方法: var wait = setInterval(function(){ var diqu = $("#diqu").val(); //确保 ...
- 【C++基础 05】友元函数和友元类
友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...
- jquery promise
认识jQuery的Promise 先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuery的Deferred对象. 打开浏览器的控制台先. <scrip ...
- excel中,一系列单元格中包含某一个字段的单元格数量?
excel中,一系列单元格中包含某一个字段的单元格数量?这个怎么写公式?如:A列单元格A1-A7的内容分别为 A.AB.BC.AC.CD.AD.EA,怎么数这一列中几个单元格的内容包含A字母? 任意单 ...
- php开n次方
php有开平方函数 sqrt,但没开n次方的函数 网上用根据什么数字原理,可用次方(pow)弄开方,格式为:pow(number, 1/ 开方数) 例如: 4的开平方,可以写成 pow(4, 1/2) ...
- HDFS原理解析(总体架构,读写操作流程)
前言 HDFS 是一个能够面向大规模数据使用的,可进行扩展的文件存储与传递系统.是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和 存储空间.让实际上是通过网络来访问文件 ...
- Google's C++ coding style
v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成 头文件 ...
- Django里面是文件静态化的方法
看Django官网的时候,由于自己的英语基础较差,而实现的谷歌翻译比较烂,只能看懂个大概.在文件静态化的时候,讲的比较繁琐一点,没怎么看懂,遂询问了一下其他人,明白了许多,但是细节需要注意的地方特别多 ...
- php学习十四:抽象,接口和多态
多态为面向对象编程的精华所在,js等面向过程的语言虽然可以模拟面向对象,但是毕竟模仿的永远比不上真的,所以了解而且会使用面向对象的多态是必不可少的 在了解多态之前,我们必须要了解接口,但是接口又是在抽 ...
- Swift 高级运算符
本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&catalog=0&sort=time&p=2 除了基本操作符中所讲的运算符 ...
