游标的的使用有日常的开发和维护的过程不使用的并不多,但是碰到一些棘手的问题的时候,游标时常是个非常好的帮手,下面就说下游标的使用方法,方法自己以后查阅,和加深一些印象,下面以一个存储过程为例
 
 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. 经典面试题:n个数字(0,1,…,n-1)形成一个圆圈

    题目: n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字删除后,从被删除数字的下一个继续删 ...

  2. SQL group 分组查询

    1.使用group by进行分组查询  在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:  被分组的列 为每个分组返回一个值得表达式,例如 ...

  3. HDU - 5136 2014icpc南京现场赛J 计数dp

    题目大意:给你一个树的直径k,要求每个点的度数不超过3, 问你有多少棵树满足条件. 思路:好难啊. 主要思想就是将一棵无根二叉树树划分成有根二叉树. 我们对k的分奇偶讨论: 我们定义dp[ i ] 为 ...

  4. python安装pip和使用pip安装Python库类比如pip安装beautifulsoup4

    初学Python时,看到很多不懂得东西,比如 pip, 是python 包管理工具,pip是easy_install的取代. Distribute是对标准库disutils模块的增强,我们知道disu ...

  5. thinkphp中如何是实现多表查询

    多表查询经常使用到,但如何在thinkphp中实现多表查询呢,其实有三种方法. 1 2 3 4 5 6 7 8 9 10 11 12 // 1.原生查询示例: $Model = new Model() ...

  6. 源码之Java集合

    No1: ArrayList的扩容策略是,新容量扩大为原来的1.5倍. ArrayList不是线性安全的,因为没有使用synchronized关键字,但是优点是效率提高了.与之相比,Vector是线性 ...

  7. web到service简单原理例子

    这是目前的理解 附上服务端源码 package com.lsw.server; import java.io.*; import java.net.*; import java.util.HashMa ...

  8. Noip模拟题 Matrix [递推,组合数]

    Matrix 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小 z 的女朋友送给小 z 一个 n × n 的矩阵.但是矩阵实在太大了,小 z 的女朋友拿不动,只能带给他两个长度为 n ...

  9. 洛谷——P2936 [USACO09JAN]全流Total Flow

    题目描述 Farmer John always wants his cows to have enough water and thus has made a map of the N (1 < ...

  10. [leetcode sort]56. Merge Intervals

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...