游标的的使用有日常的开发和维护的过程不使用的并不多,但是碰到一些棘手的问题的时候,游标时常是个非常好的帮手,下面就说下游标的使用方法,方法自己以后查阅,和加深一些印象,下面以一个存储过程为例
 
 T-SQL中的游标定义在MSDN中如下:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]
 
ALTER PROCEDURE [dbo]. [XXXX]
@ProcessName NVARCHAR (20) ---流程名
AS
DECLARE @tempIncident INT
DECLARE @tempCode NVARCHAR( 20)
DECLARE @incident NVARCHAR( 100) ---实例号
DECLARE @bicode NVARCHAR( 200)--- 单号
DECLARE @taskCnt INT ---task为的数量
DECLARE @flag INT
DECLARE @bflag INT
SET @flag = 0
SET @bflag = 0 ----定义一个游标--
----定义游标和定义一个变量是差不多的,不过后面要指定一个的查询语句,
DECLARE mycur CURSOR
FOR
( SELECT bic. BI_Code ,----这时两个的数据是要使用的数据
bic.BI_Incident
FROM xxxxx AS inc ,
bic AS bic
WHERE inc .PROCESSNAME = bic .BI_ProcessName
AND INCIDENT = bic.BI_Incident
AND PROCESSNAME = @ProcessName
AND inc .STATUS = 2
AND ( bic. BI_AuditState = 4010
OR bic .BI_AuditState = 4040
)
)
OPEN mycur--打开这个游标 FETCH NEXT FROM mycur INTO @tempCode, @tempIncident ---把值放到变量中
--循环这个值
--这是一个系统的取游标值的一个变量
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @taskCnt = COUNT(*)
FROM xxxxx
WHERE INCIDENT = @tempIncident
AND PROCESSNAME = @ProcessName
AND STATUS = 1 IF @taskCnt > 0 ---有task=1 的数据则是可以自动处理的
BEGIN
IF @flag = 0
BEGIN
SET @incident = CAST(@tempIncident AS NVARCHAR)
END
ELSE
SET @incident = @incident + ','
+ CAST (@tempIncident AS NVARCHAR )
SET @flag = 1
END ELSE
BEGIN
IF @bflag = 0
SET @bicode = @tempCode
ELSE
SET @bicode = @bicode + ',' + @tempCode
SET @bflag = 1
END
---这里的是把数据再次放到变量里面,以便循环的使用
FETCH NEXT FROM mycur INTO @tempCode, @tempIncident
END
CLOSE mycur
DEALLOCATE mycur
IF @bicode IS NULL
SET @bicode = 'NULL'
IF @incident IS NULL
SET @incident = 'NULL'
ELSE
UPDATE xxxxx
SET STATUS = 1
WHERE PROCESSNAME = @ProcessName
AND INCIDENT IN ( SELECT value
FROM dbo .fn_Split( @incident, ',') )

SQL 函数的使用:

函数在SQL中的使用提高了SQL代码的重复利用,也方便我们更高效的去用SQL做更多的事:下面我就对标量的函数进行说明,其它的东西也基本上是大同小异.

1、标量函数

Create function 函数名(参数)

Returns 返回值数据类型

[with {Encryption | Schemabinding }]

[as]

begin

SQL语句(必须有return 变量或值)

例如:

ALTER FUNCTION [dbo]. [fn_Split](@sText varchar( 8000), @sDelim varchar(20 ) = ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000 ) COLLATE SQL_Latin1_General_CP1_CI_AS )

这样就是把一个函数的基本形式定义好了 如同在代码中写出 public string get(){}

后面的代码也就是日常的sql查询或者是一些的特殊的处理

ALTER   FUNCTION [dbo]. [fn_Split](@sText varchar( 8000), @sDelim varchar(20 ) = ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000 ) COLLATE SQL_Latin1_General_CP1_CI_AS )
AS
BEGIN
DECLARE @idx smallint ,
@value varchar(8000 ),
@bcontinue bit,
@iStrike smallint,
@iDelimlength tinyint IF @sDelim = 'Space'
BEGIN
SET @sDelim = ' '
END SET @idx = 0
SET @sText = LTrim(RTrim (@sText))
SET @iDelimlength = DATALENGTH(@sDelim )
SET @bcontinue = 1 IF NOT ((@iDelimlength = 0 ) or (@sDelim = 'Empty'))
BEGIN
WHILE @bcontinue = 1
BEGIN
--If you can find the delimiter in the text, retrieve the first element and
--insert it with its index into the return table.
IF CHARINDEX (@sDelim, @sText)> 0
BEGIN
SET @value = SUBSTRING(@sText ,1, CHARINDEX( @sDelim,@sText )-1)
BEGIN
INSERT @retArray (idx , value )
VALUES (@idx , @value )
END --Trim the element and its delimiter from the front of the string.
--Increment the index and loop.
SET @iStrike = DATALENGTH(@value ) + @iDelimlength
SET @idx = @idx + 1
SET @sText = LTrim(Right(@sText ,DATALENGTH( @sText) - @iStrike )) END
ELSE
BEGIN
--If you can’t find the delimiter in the text, @sText is the last value in
--@retArray.
SET @value = @sText
BEGIN
INSERT @retArray (idx , value )
VALUES (@idx , @value )
END
--Exit the WHILE loop.
SET @bcontinue = 0
END
END
END
ELSE
BEGIN
WHILE @bcontinue=1
BEGIN
--If the delimiter is an empty string, check for remaining text
--instead of a delimiter. Insert the first character into the
--retArray table. Trim the character from the front of the string.
--Increment the index and loop.
IF DATALENGTH(@sText )>1
BEGIN
SET @value = SUBSTRING(@sText ,1, 1)
BEGIN
INSERT @retArray (idx , value )
VALUES (@idx , @value )
END
SET @idx = @idx+1
SET @sText = SUBSTRING(@sText ,2, DATALENGTH(@sText )-1) END
ELSE
BEGIN
--One character remains.
--Insert the character, and exit the WHILE loop.
INSERT @retArray (idx , value )
VALUES (@idx , @sText )
SET @bcontinue = 0
END
END END RETURN
END

SQL游标、函数的使用方法的更多相关文章

  1. sql 聚合函数、排序方法详解

    聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select Max(FSalary) from T_Employee 排 ...

  2. Sql server函数的学习2(游标函数、日期函数、字符串操纵函数)

    一.游标函数与变量 游标可以处理多行数据,在过程循环中一次访问一行.和基于集合的高效操作相比,这个功能对系统资源的消耗更大. 可以用一个函数和两个全局变量来管理游标操作 1.CURSOR_STATUS ...

  3. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  4. PCB MS SQL 标量函数(CLR) 实现DataTable转Json方法

    一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...

  5. sql 判断 函数 存储过程是否存在的方法

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...

  6. SQL游标(cursor)详细说明及内部循环使用示例

    游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 游标是处理 ...

  7. SQL server函数大全

    函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一种 ...

  8. SQL SERVER 函数大全[转]

    SQL Server 函数大全 一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下 ...

  9. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

  10. sql server 函数的自定义

    创建用户定义函数.这是一个已保存 Transact-SQL 或公共语言运行时 (CLR) 例程,该例程可返回一个值.用户定义函数不能用于执行修改数据库状态的操作.与系统函数一样,用户定义函数可从查询中 ...

随机推荐

  1. AngularJs(SPA)单页面SEO以及百度统计应用(上)

    只有两种人最具有吸引力,一种是无所不知的人,一种是一无所知的人 问:学生问追一个女孩总是追不上怎么办?回答:女孩不是追来的,是吸引来的,你追的过程是吸引女孩的过程,如果女孩没有看上你,再追都是没有用的 ...

  2. JDBC连接池和DBUtils

    本节内容: JDBC连接池 DBUtils 一.JDBC连接池 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采取连接池技术,来共享连接Conne ...

  3. Zookeeper介绍及安装部署

    本节内容: Zookeeper介绍 Zookeeper特点 Zookeeper应用场景 用到了Zookeeper的一些系统 Zookeeper集群安装部署 一.Zookeeper介绍 是一个针对大型分 ...

  4. win7下docker环境搭建nginx+php-fpm+easyswoole开发环境

    基础的环境已在文章nginx.php-fpm.swoole HTTP/TCP压测对比中搭建了,现在是在这个基础上在搭建easyswoole开发环境 主要要修改的地方是dnmp包里面的docker-co ...

  5. MCI:移动持续集成在大众点评的实践

    一.背景 美团是全球最大的互联网+生活服务平台,为3.2亿活跃用户和500多万的优质商户提供一个连接线上与线下的电子商务服务.秉承“帮大家吃得更好,生活更好”的使命,我们的业务覆盖了超过200个品类和 ...

  6. 历史文章分类汇总-Anaconda安装第三方包(whl文件)

    本文主要是对公众号之前发布的文章进行分类整理,方面大家查阅,以后会不定期对文章汇总进行更新与发布.   一.推荐阅读: Anaconda安装第三方包(whl文件) 福布斯系列之数据分析思路篇 福布斯系 ...

  7. 第2天:Django路由与视图

    在应用中创建视图定义路由 配置文件说明 静态文件使用 Django解析路由的流程 路由顺序 路由命名与reverse反推 在应用中创建视图定义路由 前面我们已经创建了子应用users,但是这个user ...

  8. 1025 PAT Ranking (25)(25 point(s))

    problem Programming Ability Test (PAT) is organized by the College of Computer Science and Technolog ...

  9. 拉格朗日乘子法以及KKT条件

    拉格朗日乘子法是一种优化算法,主要用来解决约束优化问题.他的主要思想是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有n+k个变量的无约束优化问题. 其中,利用拉格朗日乘子法 ...

  10. 表单验证插件validate

    http://www.runoob.com/jquery/jquery-plugin-validate.html <!DOCTYPE html> <html lang="e ...