Sqlserver中存储过程和游标的一些使用例子

时间:2021-12-27 10:18:09
/*带输入输出参数存储过程*/
ALTER PROCEDURE pro_test2
@userID INT,
@maxUserID INT OUTPUT,
@countUser INT OUTPUT
AS
BEGIN
SELECT * FROM dbo.SY_ADMIN WHERE UserID=@userID --10075
SELECT @maxUserID=10089
SET @countUser=20000
END;
GO /*测试*/
DECLARE @maxUserID INT,@countUser INT
EXECUTE pro_test2 10075,@maxUserID OUTPUT,@countUser OUTPUT
SELECT a=@countUser, b=@maxUserID /*带输入输出参数 0登录成功 1密码错误 2用户名错误*/
ALTER PROC proc_test3
@UserName VARCHAR(50),
@UserPwd VARCHAR(50),
@Result INT OUT
AS
BEGIN
IF @UserName = 'admin'
BEGIN
IF @UserPwd = '111'
SET @Result = 0
ELSE
SET @Result = 1
END;
ELSE
SET @Result = 2
END /*测试*/
DECLARE @Result INT
EXECUTE proc_test3 'hystu1', '111',@Result OUT
SELECT a= @Result /*游标使用例子*/
--声明2个变量
DECLARE @D_Id NVARCHAR(MAX);
DECLARE @D_Name NVARCHAR(MAX);
DECLARE @D_Password NVARCHAR(MAX);
--声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
DECLARE mycursor CURSOR
FOR
SELECT D_Id ,
D_Name,
D_Password
FROM dbo.TestTable;
--打开游标
OPEN mycursor;
--从游标里取出数据赋值到我们刚才声明的2个变量中
FETCH NEXT FROM mycursor INTO @D_Id, @D_Name, @D_Password;
--判断游标的状态
-- 0 fetch语句成功
---1 fetch语句失败或此行不在结果集中
---2 被提取的行不存在
WHILE ( @@fetch_status = 0 )
BEGIN
--显示出我们每次用游标取出的值
print (@D_Id+'--------'+@D_Name+'--------'+@D_Password)
--用游标去取下一条记录
FETCH NEXT FROM mycursor INTO @D_Id, @D_Name, @D_Password;
END;
--关闭游标
CLOSE mycursor;
--撤销游标
DEALLOCATE mycursor;
/*
SQL游标的优点是可以方便从一个结果集中进行循环遍历数据在进行操作。
1、游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,
而不是一次对整个结果集进行同一种操作;
2、它还提供对基于游标位置而对表中数据进行删除或更新的能力;
3、游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,
使两个数据处理方式能够进行沟通。
然而游标也有缺点——复杂和低效,是游标的最大缺点,也是致使很多时候在使用存储过程中没有使用游标的主要原因。
*/
--将book表中的LookCount(int型)字段加上800-1000的随机整数
DECLARE @bid INT;
DECLARE cur CURSOR READ_ONLY
FOR
SELECT bid
FROM Book;
OPEN cur;
FETCH NEXT FROM cur INTO @bid;
WHILE ( @@fetch_status = 0 )
BEGIN
UPDATE dbo.Book
SET LookCount = LookCount + CAST(( RAND() * ( 1000 - 800 ) + 800 ) AS INT)
WHERE bid = @bid;
FETCH NEXT FROM cur INTO @bid;
END;
CLOSE cur;
DEALLOCATE cur;
--声明3个变量
DECLARE @D_Id NVARCHAR(MAX);
DECLARE @D_Name NVARCHAR(MAX);
DECLARE @D_Password NVARCHAR(MAX);
create table #tmp (id NVARCHAR(MAX),name NVARCHAR(MAX),pwd NVARCHAR(MAX)) --建立临时数据表
--声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
DECLARE mycursor CURSOR
FOR
SELECT D_Id ,
D_Name,
D_Password
FROM dbo.TestTable;
--打开游标
OPEN mycursor;
--从游标里取出数据赋值到我们刚才声明的3个变量中
FETCH NEXT FROM mycursor INTO @D_Id, @D_Name, @D_Password;
--判断游标的状态
-- 0 fetch语句成功
---1 fetch语句失败或此行不在结果集中
---2 被提取的行不存在
WHILE ( @@fetch_status = 0 )
BEGIN
--显示出我们每次用游标取出的值
--print (@D_Id+'--------'+@D_Name+'--------'+@D_Password)
INSERT INTO #tmp(id,name,pwd) VALUES(@D_Id,@D_Name,@D_Password)
--用游标去取下一条记录
FETCH NEXT FROM mycursor INTO @D_Id, @D_Name, @D_Password;
END;
--关闭游标
CLOSE mycursor;
--撤销游标
DEALLOCATE mycursor;
SELECT * FROM #tmp; --查询结果
DROP TABLE #tmp --删除临时表

Sqlserver中存储过程和游标的一些使用例子

USE [JianKu]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[pro_GetProductSale]
@BeginDate NVARCHAR(20),
@EndDate NVARCHAR(20),
@PageIndex INT,
@PageSize INT,
@Keyword NVARCHAR(50)
AS
DECLARE @PageSql NVARCHAR(MAX)
DECLARE @Sql NVARCHAR(MAX)
DECLARE @Where NVARCHAR(200)
DECLARE @WhereEnd NVARCHAR(200)
DECLARE @CountSql NVARCHAR(MAX)
SET @Where=''
SET @WhereEnd=''
IF ISNULL(@BeginDate, '') <>''
BEGIN
SET @Where += ' AND k.PayDate >='''+ @BeginDate + ''''
END
IF ISNULL(@EndDate, '') <>''
BEGIN
SET @Where += ' AND k.PayDate <='''+ @EndDate + ''''
END
IF ISNULL(@Keyword, '') <>''
BEGIN
SET @WhereEnd += ' AND (b.Name like ''%'+ @Keyword + '%''
OR c.Name like ''%'+ @Keyword + '%''
OR d.Name like ''%'+ @Keyword + '%''
OR a.Part like ''%'+ @Keyword + '%''
OR a.GoodsName like ''%'+ @Keyword + '%'')
'
END
SET @Sql='
SELECT a.*,b.Name AS CategoryName,c.Name AS BrandName,d.Name AS ModelName,
t.SumSaleCount,t.SumSaleAmount
FROM dbo.Goods a
LEFT JOIN dbo.GoodsPlatType b ON a.PlatId=b.Id
LEFT JOIN dbo.GoodsBrand c ON a.BrandId=c.Id
LEFT JOIN dbo.GoodsModel d ON a.ModelId=d.Id
LEFT JOIN
(
SELECT TOP 1 g.GoodsId, SUM(g.GoodsIdNum) AS SumSaleCount,SUM(g.GoodsIdNum*g.GoodsPrice) AS SumSaleAmount
FROM dbo.GoodsOrderDetails g INNER JOIN dbo.GoodsOrder k ON g.OrderId=k.Id
AND k.Statuc=100 ' + @Where + '
GROUP BY g.GoodsId
) as t ON a.Id=t.GoodsId
WHERE a.IsDelete=1 ' + @WhereEnd
SET @CountSql='SELECT count(1) as TotalRecord FROM (' + @Sql + ') as tp'
SET @PageSql='SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY Id) AS ROWID,
* FROM ('+@Sql+') as tpp ) AS t WHERE ROWID BETWEEN '
+ CAST((@PageIndex - 1) * @PageSize + 1 AS NVARCHAR(20))
+' AND '+ CAST(@PageIndex * @PageSize AS NVARCHAR(20))
PRINT @PageSql
EXEC(@PageSql)
EXEC(@CountSql) --EXEC pro_GetProductSale @BeginDate='',@EndDate='',@PageIndex=2,@PageSize=10,@Keyword='小米'

Sqlserver中存储过程和游标的一些使用例子

Sqlserver中存储过程和游标的一些使用例子的更多相关文章

  1. Sqlserver中存储过程,触发器,自定义函数(一)

    Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...

  2. SQLServer 中存储过程

    SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)存储过程有三种返回:   1.   用return返回数字型数据   2.   用返回参数 ...

  3. Sqlserver中存储过程,触发器,自定义函数(二)

    Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数 ...

  4. Sqlserver中存储过程,触发器,自定义函数

    Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...

  5. SqlServer中存储过程中将Exec的执行结果赋值给变量输出

    原文 SqlServer中存储过程中将Exec的执行结果赋值给变量输出 背景: 遇到这样一种情况:动态向存储过程中传入表名和表的某些属性(这里用到的是主键ID),然后利用这两个变量查出一条数据的某些字 ...

  6. SqlServer中存储过程 returnC&num;代码处理以及对应的MySQL如何改写

    一.SqlServer 中 1. 创建表 create table testuser( id int, --primary key, names ), address ), paw ) ) 2.创建存 ...

  7. sqlserver 中存储过程的基础知识记录

    1.什么是存储过程? 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 2.为什么要用存储过程? 1)存储过程只在创建时进行 ...

  8. SQLServer中存储过程StoredProcedure创建及C&num;调用(转)

    此文作为入门了解用,转自http://www.2cto.com/database/201502/378260.html 存储过程就是已经编译好的.优化过的放在数据库服务器中的一些SQL语句:可供应用程 ...

  9. SqlServer和MySQL中存储过程out返回值处理C&num;代码

    1.SqlServer中out处理 C#代码 #region"SqlServer中存储过程处理out返回值" //public void getdata() //{ // stri ...

随机推荐

  1. SQLite 的创建与编辑

    创建数据库语句 -(void)creatData { sqlite3 *sqlite = nil; NSString *filePath = [NSHomeDirectory() stringByAp ...

  2. AFN----AFNetworking

    一.介绍 官方介绍: 1.适用于iOS和Mac OS X两个平台的网络库 2.基于Foundation URL Loading System上进行一套封装 3.提供了丰富的API接口 4.是一个轻量级 ...

  3. How to delete expired archive log files using rman&quest;

    he following commands will helpful to delete the expired archive log files using Oracle Recovery Man ...

  4. 【转载】set&lowbar;input&lowbar;delay和set&lowbar;output&lowbar;delay的选项-max和-min的讨论

    转自:http://www.cnblogs.com/freshair_cnblog/archive/2012/09/12/2681060.html 一.存在背景分析 文档的说法是,set_input_ ...

  5. iOS开发——网络编程OC篇&amp&semi;GCDAsyncSocket编程

    GCDAsyncSocket编程 同上一篇文章一样,这里也是使用Socket实现一个聊天室,但是这里使用的是一个常用的框架实现的:GCDAsyncSocket 一:导入这个框架 二:声明这个Socke ...

  6. LKD&colon; Chapter 7 Interrupts and Interrupt Handlers

    Recently I realized my English is still far from good. So in order to improve my English, I must not ...

  7. C&num;比较两个对象是否为同一个对象。

    两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...

  8. Spring MVC整合Mybatis 入门

    本文记录使用Intellij创建Maven Web工程搭建Spring MVC + Mybatis 的一个非常简单的示例.关于Mybatis的入门使用可参考这篇文章,本文在该文的基础上,引入了Spri ...

  9. 用svg绘制圣诞帽

    今天是圣诞节,无意中看到csdn博客上面给我的头像带了个圣诞帽,比较好奇,想看看csdn是怎么实现的,果然用的是svg实现,不过代码有点冗长. <html> <body> &l ...

  10. &lbrack;学习&rsqb; 从 函数式编程 到 lambda演算 到 函数的本质 到 组合子逻辑

    函数式编程 阮一峰 <函数式编程初探>,阮一峰是<黑客与画家>的译者. wiki <函数编程语言> 一本好书,<计算机程序的构造与解释>有讲到schem ...