sqlserver存储过程集锦

合集下载

SQLServer存储过程返回值总结.

SQLServer存储过程返回值总结.

SQLServer 存储过程返回值总结1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况(1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几(2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。

' 则 count = -1;在显示栏中假如有查询结果,则 count = -1总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。

B.不论 ExecuteNonQuery(方法是按照CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。

---------------------------------------------------------------------------------------------------------------------------------------------------2. 获得存储过程的返回值 --通过查询分析器获得(1不带任何参数的存储过程 (存储过程语句中含有 return---创建存储过程CREATE PROCEDURE testReturnASreturn 145GO---执行存储过程DECLARE @RC intexec @RC=testReturnselect @RC---说明查询结果为 145(2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程create procedure sp_add_table1@in_name varchar(100,@in_addr varchar(100,@in_tel varchar(100asif(@in_name = '' or @in_name is nullreturn 1elsebegininsert into table1(name,addr,telvalues(@in_name,@in_addr,@in_telreturn 0end---执行存储过程<1>执行下列,返回 1declare @count int exec @count = sp_add_table1 '','中三路 ','123456' select @count <2>执行下列,返回 0declare @count int exec @count = sp_add_table1 '','中三路 ','123456' select @count ---说明查询结果不是 0就是 1(3带输出参数的存储过程 (存储过程中可以有 return 可以没有 return例子 A :---创建存储过程create procedure sp_output@output int outputasset @output = 121return 1---执行存储过程<1>执行下列,返回 121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回 1declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明有 return ,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为 return 返回的值例子 B :---创建存储过程create procedure sp_output@output int outputasset @output = 121---执行存储过程<1>执行下列,返回 121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回 0declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明没有 return ,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为 0总结:(1存储过程共分为 3类:A. 返回记录集的存储过程 ---------------------------其执行结果是一个记录集,例如:从数据库中检索出符合某一个或几个条件的记录B. 返回数值的存储过程 (也可以称为标量存储过程 -----其执行完以后返回一个值,例如:在数据库中执行一个有返回值的函数或命令C. 行为存储过程 -----------------------------------用来实现数据库的某个功能,而没有返回值,例如:在数据库中的更新和删除操作(2含有 return 的存储过程其返回值为 return 返回的那个值(3没有 return 的存储过程,不论执行结果有无记录集,其返回值是 0(4带输出参数的存储过程:假如有 return 则返回 return 返回的那个值,假如要select 输出参数,则出现输出参数的值,于有无 return 无关---------------------------------------------------------------------------------------------------------------------------------------------------3. 获得存储过程的返回值 --通过程序获得---------------------------------------------------------------------------------------------------------------------------------------------------SqlParameter[] cmdParms = { .. ,newSqlParameter("@return",SqlDbType.Int};cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue; 或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input; 得到返回值 object bj = cmdParms[cmdParms.Length - 1].Value;。

SqlServer存储过程调用存储过程接收输出参数返回值

SqlServer存储过程调用存储过程接收输出参数返回值
接收输出参数:
DECLARE @count INT EXECUTE GetCustomers @count OUTPUT PRINT @count
2,带返回值
创建存储过பைடு நூலகம்:
ALTER PROCEDURE [dbo].[GetCustomers] AS
SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers] RETURN @@rowcount
创建存储过程:
ALTER PROCEDURE [dbo].[GetCustomers] (@rowcount INT OUTPUT) AS
SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers] SET @rowcount=@@rowcount
接收返回值:
DECLARE @count INT EXECUTE @count=GetCustomers PRINT @count
以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何 疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

sqlserver储存过程简单写法

sqlserver储存过程简单写法

sqlserver储存过程简单写法全文共四篇示例,供读者参考第一篇示例:SQL Server是一种流行的关系型数据库管理系统,储存过程是一个可以包含一系列SQL语句的代码块,可以被多次调用来完成特定的任务。

储存过程可以提高数据库性能、安全性和可维护性,因为它们可以减少应用程序与数据库之间的数据传输量,并且可以把逻辑代码集中在数据库中。

在SQL Server中,储存过程通常是使用T-SQL编写的。

下面我们将介绍SQL Server中储存过程的简单写法,让您能够轻松地创建和使用储存过程。

1. 创建储存过程要创建一个储存过程,您需要使用CREATE PROCEDURE语句,后面跟着储存过程的名称和参数(如果有的话),然后是储存过程的主体代码。

以下是一个简单的示例,创建一个接受一个参数并返回查询结果的储存过程:```sqlCREATE PROCEDURE GetEmployeeByID@EmployeeID INTASBEGINSELECT * FROM Employees WHERE EmployeeID =@EmployeeIDEND```在这个例子中,我们创建了一个名为GetEmployeeByID的储存过程,它接受一个参数@EmployeeID,然后查询Employees表中的数据并返回给用户。

以下是执行上面创建的GetEmployeeByID储存过程的示例:```sqlEXEC GetEmployeeByID @EmployeeID = 1```总结:通过本文的介绍,您应该已经了解了SQL Server中储存过程的简单写法。

创建、执行、修改和删除储存过程是数据库管理的基本技能之一,希望这些简单示例能够帮助您更好地理解和使用储存过程。

如果您想深入学习更多关于SQL Server储存过程的知识,可以查阅相关资料或者参加专业的培训课程。

祝您在数据库管理领域取得更大的成就!第二篇示例:SQL Server是一款强大的关系型数据库管理系统,它支持存储过程(Stored Procedure)这一重要的数据库功能。

SQL Server存储过程和参数示例

SQL Server存储过程和参数示例

一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程。

微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了)。

虽然这些存储过程可能很有用并为你节省了很多时间,但是他们可以在任何时候改变他们的函数或简单的删除掉。

下面的图表显示了当许多存储过程从一个Microsoft SQL Server版本移入另一个版本时,引入了新的存储过程,而原来的一些则从安装包里删除了。

大多数的存储过程,如果不是所有的,要求用户是系统管理员服务器角色以便执行这些存储过程。

和文件系统交互的存储过程还要求执行存储过程的用户(还有SQL Server的服务帐户)具有访问文件/文件夹的权限。

sp_executeresultset微软在SQL Server 2005中删除了这个名为sp_executeresultset的便利小程序。

它允许你在空闲时通过使用SELECT查询产生动态SQL代码。

然后,作为结果的SQL命令将会在数据库上执行。

它允许你创建单独的一行代码,这行代码可以在单步中查询到你的数据库里的每一个表的记录数目(就像例子中所显示的)。

这是一个未公开的存储过程,而且无法知道它为什么被删除了。

但是,唉,这个便利的有用存储过程已经没有了。

exec sp_execresultset 'SELECT ''SELECT '''''' + name + '''''',count(*) FROM '' + namefrom sysobjectswhere xtype = ''U'''sp_MSforeachdb / sp_MSforeachtablesp_MSforeachdb / sp_MSforeachtable两个存储过程,sp_MSforeachdb和sp_MSforeachtable封装了一个指针。

SQLserver存储过程语法及实例

SQLserver存储过程语法及实例

SQLserver存储过程语法及实例存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。

--------------------基本语法--------------------一.创建存储过程create procedure sp_name()begin.........end二.调用存储过程1.基本语法:call sp_name()注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递三.删除存储过程1.基本语法:drop procedure sp_name//2.注意事项(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程四.其他常用命令1.show procedure status显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等2.show create procedure sp_name显示某一个mysql存储过程的详细信息--------------------数据类型及运算符--------------------一、基本数据类型:略二、变量:自定义变量:DECLARE a INT ; SET a=100; 可用以下语句代替:DECLARE a INT DEFAULT 100;变量分为用户变量和系统变量,系统变量又分为会话和全局级变量用户变量:用户变量名一般以@开头,滥用用户变量会导致程序难以理解及管理1、在mysql客户端使用用户变量mysql> SELECT 'Hello World' into @x;mysql> SELECT @x;mysql> SET @y='Goodbye Cruel World';mysql> select @y;mysql> SET @z=1+2+3;mysql> select @z;2、在存储过程中使用用户变量mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');mysql> SET @greeting='Hello';mysql> CALL GreetWorld( );3、在存储过程间传递全局范围的用户变量mysql> CREATE PROCEDURE p1( ) SET @last_procedure='p1';mysql> CREATE PROCEDURE p2( ) SELECT CONCAT('Last procedure was ',@last_procedure);mysql> CALL p1( );mysql> CALL p2( );三、运算符:1.算术运算符+ 加 SET var1=2+2; 4- 减 SET var2=3-2; 1* 乘 SET var3=3*2; 6/ 除 SET var4=10/3; 3.3333DIV 整除 SET var5=10 DIV 3; 3% 取模 SET var6=10%3 ; 12.比较运算符> 大于 1>2 False< 小于 2<1 False<= 小于等于 2<=2 True>= 大于等于 3>=2 TrueBETWEEN 在两值之间 5 BETWEEN 1 AND 10 TrueNOT BETWEEN 不在两值之间 5 NOT BETWEEN 1 AND 10 False IN 在集合中 5 IN (1,2,3,4) FalseNOT IN 不在集合中 5 NOT IN (1,2,3,4) True= 等于 2=3 False<>, != 不等于 2<>3 False<=> 严格比较两个NULL值是否相等NULL<=>NULL TrueLIKE 简单模式匹配 "Guy Harrison" LIKE "Guy%" TrueREGEXP 正则式匹配"Guy Harrison" REGEXP "[Gg]reg" FalseIS NULL 为空 0 IS NULL FalseIS NOT NULL 不为空 0 IS NOT NULL True3.逻辑运算符4.位运算符| 或& 与<< 左移位>> 右移位~ 非(单目运算,按位取反)注释:mysql存储过程可使用两种风格的注释双横杠:--该风格一般用于单行注释c风格:/* 注释内容 */ 一般用于多行注释--------------------流程控制--------------------一、顺序结构二、分支结构ifcase三、循环结构for循环while循环loop循环repeat until循环注:区块定义,常用begin......end;也可以给区块起别名,如:lable:begin...........end lable;可以用leave lable;跳出区块,执行区块以后的代码begin和end如同C语言中的{ 和 }。

sqlserver数据库查询存储过程

sqlserver数据库查询存储过程

sqlserver数据库查询存储过程英文版SQL Server Database Querying with Stored ProceduresIn the realm of database management systems, SQL Server stands tall as a reliable and powerful tool. Among its numerous features, stored procedures are a noteworthy aspect that enhances the efficiency and organization of database operations. Stored procedures are pre-compiled sets of SQL statements that can be stored in the database and called upon when needed, much like functions in programming languages.Advantages of Stored Procedures:Performance Boost: Since stored procedures are pre-compiled, they execute much faster than ad-hoc SQL queries.Code Reusability: They can be reused across multiple applications or even within the same application, reducing redundant code.Security: By limiting access to the underlying data, stored procedures provide a layer of security.Maintenance: Changes made to a stored procedure affect all its invocations, making maintenance easier.Querying with Stored Procedures in SQL Server:Querying a SQL Server database using stored procedures involves several steps:Step 1: Creating a Stored ProcedureTo create a stored procedure, you need to use the CREATE PROCEDURE statement followed by the procedure name and the SQL statements that define the procedure. For example: sqlCopy CREATE PROCEDURE GetEmployeeDetails@EmployeeID INTASBEGINSELECT * FROM Employees WHERE ID = @EmployeeIDENDCREATE PROCEDURE GetEmployeeDetails@EmployeeID INTASBEGINSELECT * FROM Employees WHERE ID = @EmployeeID ENDIn this example, GetEmployeeDetails is the name of the stored procedure, and @EmployeeID is a parameter that accepts an integer value. The SELECT statement fetches the details of an employee based on the provided EmployeeID.Step 2: Executing the Stored ProcedureTo execute the stored procedure, you use the EXEC command followed by the procedure name and any required parameters. For the above example:sqlCopy EXEC GetEmployeeDetails @EmployeeID = 1EXEC GetEmployeeDetails @EmployeeID = 1This command will execute the GetEmployeeDetails stored procedure and return the details of the employee with an ID of 1.Conclusion:Stored procedures in SQL Server are a powerful tool for organizing and optimizing database queries. They provide better performance, code reusability, and security, making them an integral part of any database-driven application. By understanding how to create and execute stored procedures, database administrators and developers can leverage the full potential of SQL Server and ensure efficient and secure data access.中文版SQL Server 数据库使用存储过程进行查询在数据库管理系统的领域中,SQL Server 作为一个可靠且强大的工具备受推崇。

SqlServer存储过程详解

SqlServer存储过程详解

SqlServer存储过程详解SqlServer存储过程详解1.创建存储过程的基本语法模板:if (exists (select*from sys.objects where name ='pro_name'))drop proc pro_namegocreate proc pro_name@param_name param_type [=default_value]asbeginsql语句endps:[]表⽰⾮必写内容。

sys.objects存储的是本数据库中的信息,不仅仅存储表名,还有存储过程名、视图名、触发器等等。

例如:1if (exists (select*from sys.objects where name ='USP_GetAllUser'))2drop proc USP_GetAllUser3go4create proc USP_GetAllUser5@UserId int=16as7set nocount on;8begin9select*from UserInfo where Id=@UserId10endps:SQL Server 实⽤⼯具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。

当前批处理语句是⾃上⼀ GO 命令后输⼊的所有语句,若是第⼀条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。

2.调⽤⽅法:exec P_GetAllUser 2;ps:⼀般在执⾏存储过程是,最好加上架构名称,例如 P_GetAllUser 这样可以可以减少不必要的系统开销,提⾼性能。

因为如果在存储过程名称前⾯没有加上架构名称,SQL SERVER ⾸先会从当前数据库sys schema(系统架构)开始查找,如果没有找到,则会去其它schema查找,最后在dbo架构(系统管理员架构)⾥⾯查找。

SQLServer执行存储过程

SQLServer执行存储过程

SQLServer执⾏存储过程⼀.不含参数的存储过程1.没有返回值:创建语句:CREATE PROCEDURE dbo.ProTestASDECLARE @test intSET @test = 1Go执⾏SQL语句:EXEC dbo.ProTest消息:命令已成功完成。

结果:⽆2.有返回值(使⽤select):创建语句:CREATE PROCEDURE dbo.ProTestASDECLARE @test INT;SET @test = 123;SELECT @test;GO执⾏SQL语句:EXEC dbo.ProTest消息:(1 ⾏受影响)。

结果:123(表结构形式)3.有返回值(使⽤return)创建语句:CREATE PROCEDURE dbo.ProTestASDECLARE @test INT;SET @test = 123;RETURN @test;GO执⾏SQL语句:DECLARE @test INT;EXEC @test = dbo.ProTest;SELECT @test消息:(1 ⾏受影响)。

结果:123(表结构形式)4.查询⼀个或多个集合(类似执⾏select)创建语句:CREATE PROCEDURE dbo.ProTestASSELECT *FROM dbo.Material_SO_PipeOrder;GO执⾏SQL语句:EXEC dbo.ProTest消息:查询出来的条数结果:查询结果⼆.含参数的存储过程1.没有返回值创建语句:CREATE PROCEDURE dbo.ProTest@OrderNO NVARCHAR(50) ,@OrderName NVARCHAR(50) ,@RMDSC NVARCHAR(500) = NULL --表⽰可为空参数ASIF ( @OrderNO IS NOT NULL )BEGININSERT INTO dbo.Material_SO_PipeOrder( ID, OrderNO, OrderName, RMDSC )VALUES ( NEWID(), -- ID - uniqueidentifier@OrderNO, -- OrderNO - nvarchar(50)@OrderName, -- OrderName - nvarchar(50)@RMDSC -- RMDSC - nvarchar(500));END;GO执⾏SQL语句:EXEC dbo.ProTest @OrderNO = N'单号001', @OrderName = N'名称001', @RMDSC = N'备注'(或不写列名"EXEC dbo.ProTest N'单号001', N'名称001', N'备注';",但不能混合使⽤,下同)消息:(1 ⾏受影响)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sqlserver存储过程集锦(一)常用存储过程集锦,都是一些mssql常用的一些,大家可以根据需要选择使用。

=================分页========================== /*分页查找数据*/ CREATE PROCEDURE [dbo].[GetRecordSet] @strSql varchar(8000),--查询sql,如select * from [user] @PageIndex int,--查询当页号 @PageSize int--每页显示记录 AS set nocount on declare @p1 int declare @currentPage int set @currentPage = 0 declare @RowCount int set @RowCount = 0 declare @PageCount int和 "sqlserver存储过程集锦(一)" 有关的 数据库 编程小帖士:strong>LOGLOG函数返回数值的非自然对数。

set @PageCount = 0 exec sp_cursoropen @p1 output,@strSql,@scrollopt=1,@ccopt=1,@rowcount=@rowCount output --得到总记录数 select @PageCount=ceiling(1.0*@rowCount/@pagesize) --得到总页数 ,@currentPage=(@PageIndex-1)*@PageSize+1 select @RowCount,@PageCount exec sp_cursorfetch @p1,16,@currentPage,@PageSize exec sp_cursorclose @p1 set nocount off GO =========================用户注册============================ /* 用户注册,也算是添加吧 */ Create proc [dbo].[UserAdd] ( @loginID nvarchar(50), --登录帐号 @password nvarchar(50), --密码 @email nvarchar(200) --电子信箱 ) as declare @userID int --用户编号 --登录账号已经被注册 if exists(select loginID from tableName where loginID = @loginID) begin return -1; end --邮箱已经被注册 else if exists(select email from tableName where email = @email) begin return -2; end --注册成功 else begin select @userID = isnull(max(userID),100000)+1 from tableName insert into tableName (userID,loginID,[password],userName,linkNum,address,email,createTime,status) values (@userID,@loginID,@password,'','','',@email,getdate(),1) return @userID end =================sql server系统存储过程================ –1.给表中字段添加描述信息 Create table T2 (id int , name char (20)) GO EXEC sp_addextendedproperty 'MS_Description', 'Employee ID', 'user', dbo,'table', T2, 'column', id EXEC sp_updateextendedproperty 'MS_Description', 'this is a test', 'user', dbo, 'table', T2, 'column', id –2.修改数据库名称 EXEC sp_renamedb 'old_db_name', 'new_db_name' –3.修改数据表名称和字段名称 EXEC sp_rename 'old_table_name', 'new_table_name'–修改数据表名称 EXEC sp_rename 'table_name.[old_column_name]', 'new_column_name', 'COLUMN'–修改字段名称 –4.给定存储过程名,获取存储过程内容 exec sp_helptext sp_name /*以下是有关安全控制的系统存储过程或 SQL 语句,详细语法查阅《联机丛书》相关内容*/ –创建新的 SQL Server 登录,使用户得以连接使用 SQL Server 身份验证的 SQL Server。

EXEC sp_addlogin @loginame = '', @passwd = '', @defdb = '', @deflanguage = NULL, @sid = NULL, @encryptopt = NULL –使 Windows NT 用户或组帐户得以使用 Windows 身份验证连接到 SQL Server。

EXEC sp_grantlogin @loginame = '' –删除 SQL Server 登录,以阻止使用该登录名访问 SQL Server。

EXEC sp_droplogin @loginame = '' –阻止 Windows NT 用户或组连接到 SQL Server。

EXEC sp_denylogin @loginame = '' –从 SQL Server 中删除用 sp_grantlogin 或 sp_denylogin 创建的 Windows NT 用户或组的登录项。

EXEC sp_revokelogin @loginame = '' –更改登录的默认数据库。

EXEC sp_defaultdb @loginame = '', @defdb = '' –更改登录的默认语言。

EXEC sp_defaultlanguage @loginame = '', @language = '' –添加或更改 SQL Server 登录密码。

EXEC sp_password @old = '', @new = '', @loginame = '' –添加服务器角色新成员。

EXEC sp_addsrvrolemember @loginame = '', @rolename = '' –添加服务器角色某成员。

EXEC sp_dropsrvrolemember @loginame = '' , @rolename = '' –为 SQL Server 登录或 Windows NT 用户或组在当前数据库中添加一个安全帐户,并使其能够被授予在数据库中执行活动的权限(授予默认的“public”数据库角色)。

EXEC sp_grantdbaccess @loginame = '', @name_in_db = NULL –或 EXEC sp_adduser @loginame = '', @name_in_db = NULL, @grpname = '' –从当前数据库中删除安全帐户。

EXEC sp_revokedbaccess @name_in_db = '' –或 EXEC sp_dropuser @name_in_db = '' –在当前数据库创建新数据库角色。

EXEC sp_addrole @rolename = '', @ownername = '' –在当前数据库删除某数据库角色。

EXEC sp_droprole @rolename = '' –在当前数据库中添加数据库角色新成员。

EXEC sp_addrolemember @rolename = '', @membername = '' –在当前数据库中删除数据库角色某成员。

EXEC sp_droprolemember @rolename = '', @membername = '' –权限分配给数据库角色、表、存储过程等对象 –1、授权访问 GRANT –2、拒绝访问 DENY –3、取消授权或拒绝 REVOKE –4、Sample(pubs): GRANT SELECT ON authors TO Limperator DENY SELECT ON authors TO Limperator REVOKE SELECT ON authors TO Limperator两个sql server 2000的通用分页存储过程发表日期:2007-3-17 |-第一个支持唯一主键,第二支持多主键,测试过,效率一般CREATE PROC P_viewPage/*no_mIss 分页存储过程 2007.2.20 QQ:34813284适用于单一主键或存在唯一值列的表或视图*/@TableName VARCHAR(200), --表名@FieldList VARCHAR(2000), --显示列名@PrimaryKey VARCHAR(100), --单一主键或唯一值键@Where VARCHAR(1000), --查询条件不含'where'字符@Order VARCHAR(1000), --排序不含'order by'字符,如id asc,userid desc,当@SortType=3时生效@SortType INT, --排序规则 1:正序asc 2:倒序desc 3:多列排序 @RecorderCount INT, --记录总数 0:会返回总记录@PageSize INT, --每页输出的记录数@PageIndex INT, --当前页数@TotalCount INT OUTPUT, --返回记录总数@TotalPageCount INT OUTPUT --返回总页数ASSET NOCOUNT ONIF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''OR ISNULL(@PrimaryKey,'') = ''OR @SortType < 1 OR @SortType >3OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0BEGINRETURNENDDECLARE @new_where1 VARCHAR(1000)DECLARE @new_where2 VARCHAR(1000)DECLARE @new_order VARCHAR(1000)DECLARE @Sql VARCHAR(8000)DECLARE @SqlCount NVARCHAR(4000)IF ISNULL(@where,'') = ''BEGINSET @new_where1 = ' 'SET @new_where2 = ' WHERE 'ENDELSEBEGINSET @new_where1 = ' WHERE ' + @whereSET @new_where2 = ' WHERE ' + @where + ' AND 'ENDIF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2BEGINIF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'ENDELSEBEGINSET @new_order = ' ORDER BY ' + @OrderENDSET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/' + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1IF @RecorderCount = 0BEGINEXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',@TotalCount OUTPUT,@TotalPageCount OUTPUTENDELSEBEGINSELECT @TotalCount = @RecorderCountENDIF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)BEGINSET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)ENDIF @PageIndex = 1BEGINSET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '+ @TableName + @new_where1 + @new_orderENDELSEBEGINIF @SortType = 1BEGINSET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' > ' + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey+ ' FROM ' + @TableName+ @new_where1 + @new_order +' ) AS TMP) '+ @new_orderENDIF @SortType = 2BEGINSET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' < ' + '(SELECT MIN(' + @PrimaryKey + ') FROM(SELECT TOP '+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey+' FROM '+ @TableName+ @new_where1 + @new_order + ') AS TMP) '+ @new_orderENDIF @SortType = 3BEGINIF CHARINDEX(',',@Order) = 0 BEGIN RETURN ENDSET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '+ @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey+ ' FROM ' + @TableName + @new_where1 + @new_order + ')'+ @new_orderENDENDEXEC(@Sql)GOCREATE PROC P_public_ViewPage_per/*no_mIss 通用分页存储过程 2007.3.1 QQ:34813284适用于联合主键/单主键/存在能确定唯一行列/存在能确定唯一行的多列 (用英文,隔开)调用:第一页查询时返回总记录和总页数及第一页记录:EXECUTE P_public_ViewPage_per'TableName','col1,col2,col3,col4','pk1,pk2,pk3','col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',0,10,1,@TotalCount OUTPUT,@TotalPageCount OUTPUT其它页调用,比如第89页(假设第一页查询时返回总记录为2000000):EXECUTE P_public_ViewPage_per'TableName','col1,col2,col3,col4','pk1,pk2,pk3','col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',2000000,10,89,@TotalCount OUTPUT,@TotalPageCount OUTPUT*/@TableName VARCHAR(200), --表名@FieldList VARCHAR(2000), --显示列名@PrimaryKey VARCHAR(100), --单一主键或唯一值键或联合主键列表(用英文,隔开)或能确定唯一行的多列列表(用英文,隔开)@Where VARCHAR(1000), --查询条件不含'where'字符@Order VARCHAR(1000), --排序不含'order by'字符,用英文,隔开 @RecorderCount INT, --记录总数 0:会返回总记录@PageSize INT, --每页输出的记录数@PageIndex INT, --当前页数@TotalCount INT OUTPUT, --返回记录总数@TotalPageCount INT OUTPUT --返回总页数ASSET NOCOUNT ONSET @FieldList = REPLACE(@FieldList,' ','')IF @FieldList = '*'BEGIN SET @FieldList = 'A.*'ENDELSEBEGINSET @FieldList = 'A.' + REPLACE(@FieldList,',',',A.')ENDWHILE CHARINDEX(', ',@Order)>0BEGINSET @Order = REPLACE(@Order,', ',',')ENDIF ISNULL(@TableName,'') = '' OR ISNULL(@PrimaryKey,'') = '' OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0BEGINRETURNENDDECLARE @new_where1 VARCHAR(1000)DECLARE @new_where2 VARCHAR(1000)DECLARE @new_where3 VARCHAR(1000)DECLARE @new_where4 VARCHAR(1000)DECLARE @new_order1 VARCHAR(1000)DECLARE @new_order2 VARCHAR(1000)DECLARE @Fields VARCHAR(1000)DECLARE @Sql VARCHAR(8000)DECLARE @SqlCount NVARCHAR(4000)SET @Fields = @PrimaryKey + ','SET @new_where2 = ''SET @new_where4 = ''IF ISNULL(@where,'') = ''BEGINSET @new_where1 = ' 'SET @new_where3 = ' WHERE 'ENDELSEBEGINSET @new_where1 = ' WHERE ' + @where + ' 'SET @new_where3 = ' WHERE 1=1 '+ REPLACE(' AND ' + @where,' AND ',' AND A.')+ ' AND 'ENDWHILE CHARINDEX(',',@Fields)>0BEGINSET @new_where2 = @new_where2+ 'A.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))+ ' = B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' AND 'SET @new_where4 = @new_where4+ 'B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' IS NULL AND 'SET @Fields =SUBSTRING(@Fields,CHARINDEX(',',@Fields)+1,LEN(@Fields))ENDSET @new_where2 = LEFT(@new_where2,LEN(@new_where2)-4)SET @new_where4 = LEFT(@new_where4,LEN(@new_where4)-4)IF ISNULL(@order,'') = ''BEGINSET @new_order1 = ''SET @new_order2 = ''ENDELSEBEGINSET @new_order1 = ' ORDER BY ' + @OrderSET @new_order2 = ' ORDER BY '+ RIGHT(REPLACE(',' + @Order,',',', A.' ),LEN(REPLACE(',' + @Order,',',', A.' ))-1)ENDSET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/' + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName+ ' A ' + @new_where1IF @RecorderCount = 0BEGINEXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',@TotalCount OUTPUT,@TotalPageCount OUTPUTENDELSEBEGINSELECT @TotalCount = @RecorderCountENDIF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)BEGINSET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)ENDIF @PageIndex = 1BEGINSET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '+ @TableName + ' A'+ @new_where1 + @new_order1ENDELSEBEGINSET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '+ @TableName + ' A LEFT JOIN (SELECT TOP '+ STR(@PageSize*(@PageIndex-1))+ ' ' + @PrimaryKey + ' FROM ' + @TableName + @new_where1+ @new_order1 + ' )B ON ' + @new_where2 + @new_where3 + @new_where4 + @new_order2ENDEXEC(@Sql)GO。

相关文档
最新文档