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存储过程调用存储过程接收输出参数返回值
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储存过程简单写法全文共四篇示例,供读者参考第一篇示例: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 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存储过程语法及实例存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。
--------------------基本语法--------------------一.创建存储过程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数据库查询存储过程英文版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存储过程详解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执⾏存储过程⼀.不含参数的存储过程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 ⾏受影响)。
SQL-Server存储过程案例详解
SQL Server存储过程入门案例详解提出问题我使用过几次SQL S erver,但所有与数据库的交互都是通过应用程序的编码来实现的。
我不知到在哪里使用存储过程,也不了解实现存储过程需要做哪些工作。
希望能详细说明。
专家答疑存储过程是存储于数据库中的一组T-SQ L语句。
有了存储过程之后,与数据库的交互就没有必要在程序中写一堆的SQL语句,而只需用一条语句调用适当的存储过程来完成就可以了。
另外,由于代码是存储在数据库中,我们也可以在不同的应用程序或查询窗口中不断的重复利用那些代码。
下面将讲述一些简单的例子,它们将说明如何构造和使用存储过程。
下面的例子将简单的说明如何创建存储过程。
以下所有例子均使用AdventureWorks数据库。
其它的数据库和应用程序可以依此类推。
例1 –简单的存储过程这个简单的存储过程将实现如下功能:从P erson.Contact表中取出第一条记录。
CREATE PROCEDURE uspGetContactASSELECT TOP 1 ContactID, FirstName, LastNameFROM Person.Contact创建完上面的语句后,使用下面的命令可以执行该存储过程。
EXEC uspGetContact查询的结果如下:例2 –带参数的存储过程这个例子在上个例子的基础上做了一点修改:传入了一个参数,根据传入的参数来查询相应的记录。
为了更好地利用上面的例子,这次我们就不用重新再创建一个存储过程了,而是使用ALTE R PROCEDURE(注意:不是CRE ATE PROCEDURE)来修改例1中已经创建好的存储过程。
代码如下:ALTER PROCEDURE uspGetContact @LastName NVARCHAR(50)ASSELECT TOP 1 ContactID, FirstName, LastNameFROM Person.ContactWHERE LastName = @LastName下面显示了运行存储过程的2种不同方法。
SQLSERVER存储过程大总结
SQLSERVER存储过程使用说明书引言首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同SQL语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
请大家先看一个小例子:create proc query_bookasselect * from bookgo--调用存储过程exec query_book请大家来了解一下存储过程的语法。
Create PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]一、参数简介1、procedure_name新存储过程的名称。
过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。
完整的名称(包括 # 或 ##)不能超过 128 个字符。
指定过程所有者的名称是可选的。
2、;number是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。
例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。
sqlserver存储过程举例
sqlserver存储过程举例SQL Server存储过程是一段预先编译好的SQL代码,能够被多次执行。
它可以接受输入参数并返回输出参数,还可以执行逻辑判断和循环等复杂操作。
下面我列举了10个例子来展示SQL Server存储过程的使用。
1. 创建新的存储过程:```sqlCREATE PROCEDURE sp_CreateNewEmployee@FirstName NVARCHAR(50),@LastName NVARCHAR(50),@Salary FLOATASBEGININSERT INTO Employees (FirstName, LastName, Salary)VALUES (@FirstName, @LastName, @Salary)END```这个存储过程用于向Employees表中插入新的员工记录。
2. 更新存储过程:```sqlCREATE PROCEDURE sp_UpdateEmployeeSalary@EmployeeID INT,@NewSalary FLOATASBEGINUPDATE EmployeesSET Salary = @NewSalaryWHERE EmployeeID = @EmployeeID END```这个存储过程用于更新指定员工的薪水。
3. 删除存储过程:```sqlCREATE PROCEDURE sp_DeleteEmployee @EmployeeID INTASBEGINDELETE FROM EmployeesWHERE EmployeeID = @EmployeeID END```这个存储过程用于删除指定员工的记录。
4. 查询存储过程:```sqlCREATE PROCEDURE sp_GetEmployeeByID@EmployeeID INTASBEGINSELECT * FROM EmployeesWHERE EmployeeID = @EmployeeIDEND```这个存储过程用于根据员工ID查询员工信息。
sqlserver select 中使用存储过程
sqlserver select 中使用存储过程SQL Server中使用存储过程是一种提高数据库性能和代码重用性的技术。
在查询中使用存储过程可以将一组SQL语句封装在一个单元中,并且可以将参数传递给存储过程。
下面是一些关于在SQL Server中使用存储过程的详细信息。
1. 存储过程的定义和使用:在SQL Server中创建和使用存储过程非常简单。
可以使用CREATE PROCEDURE语句创建存储过程,并使用EXECUTE或EXEC语句执行存储过程。
存储过程可以包含输入参数、输出参数和返回值。
以下是一个简单的存储过程的示例:CREATE PROCEDURE GetCustomersByCity@City VARCHAR(255)ASBEGINSELECT * FROM Customers WHERE City = @CityEND在上面的示例中,我们创建了一个名为GetCustomersByCity的存储过程,它接收一个City参数,并在Customers表中选择所有匹配该城市的客户。
下面是如何执行该存储过程的示例:EXEC GetCustomersByCity 'London'通过执行上面的语句,存储过程将返回所有位于伦敦的客户。
2. 存储过程的优点:使用存储过程有以下几个优点:- 提高性能:存储过程在服务器端执行,减少了网络传输量,提高了查询的执行速度。
此外,存储过程还可以进行查询优化和索引优化,进一步提高查询性能。
- 代码重用:可以将一些常用的查询逻辑封装在存储过程中,在不同的应用程序中重复使用。
这样可以减少代码量,提高开发效率。
- 安全性:存储过程可以设置权限,只有有权限的用户才能执行存储过程。
这样可以提高数据的安全性。
- 数据一致性:存储过程可以执行一系列的操作,保证数据的一致性。
例如,在一个存储过程中可以同时更新多个表,保证数据的完整性。
3. 存储过程参数的使用:存储过程可以接收输入参数、输出参数和返回值。
SQL Server 存储过程详解
SQL Server 存储过程详解◆优点:执行速度更快。
存储过程只在创造时进行编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程执行速度更快。
存储过程用于处理复杂的操作时,程序的可读性更强、网络的负担更小。
使用存储过程封装事务性能更佳。
能有效的放注入,安全性更好。
可维护性高,在一些业务规则发生变化时,有时只需调整存储过程即可,而不用改动和重编辑程序。
更好的代码重用。
◆缺点:存储过程将给服务器带来额外的压力。
存储过程多多时维护比较困难。
移植性差,在升级到不同的数据库时比较困难。
调试麻烦,SQL语言的处理功能简单。
总之复杂的操作或需要事务操作的SQL建议使用存储过程,而参数多且操作简单SQL 语句不建议使用存储过程。
存储过程定义存储过程是一组Transact-SQL 语句,它们只需编译一次,以后即可多次执行。
因为Transact-SQL 语句不需要重新编译,所以执行存储过程可以提高性能。
触发器是一种特殊的存储过程,不由用户直接调用。
创建触发器时,将其定义为在对特定表或列进行特定类型的数据修改时激发。
存储过程的设计规则CREATE PROCEDURE 定义自身可以包括任意数量和类型的SQL 语句,但以下语句除外。
不能在存储过程的任何位置使用这些语句。
CREATE AGGREGATE、CREATE RULE、CREATE DEFAULT、CREATE SCHEMA、CREATE 或ALTER FUNCTION、CREATE 或ALTER TRIGGER、CREATE 或ALTER PROCEDURE、CREATE 或ALTER VIEW、SET PARSEONLY、SET SHOWPLAN_ALL、SET SHOWPLAN_TEXT、SET SHOWPLAN_XML、USE database_name其他数据库对象均可在存储过程中创建。
可以引用在同一存储过程中创建的对象,只要引用时已经创建了该对象即可。
sqlserver存储过程例子
sqlserver存储过程例子SQL Server是一种关系型数据库管理系统,它支持存储过程,存储过程是一组预编译的SQL语句,可以接收参数并返回结果。
它可以用于实现复杂的业务逻辑,提高数据库的性能和安全性。
下面列举了10个符合要求的存储过程例子。
1. 查询指定部门的员工数量该存储过程接收部门ID作为参数,然后使用COUNT函数查询该部门的员工数量,并返回结果。
2. 插入新员工信息该存储过程接收员工的姓名、部门ID等信息作为参数,然后使用INSERT语句将员工信息插入到数据库中。
3. 更新员工信息该存储过程接收员工ID和要更新的信息作为参数,然后使用UPDATE语句将指定员工的信息更新到数据库中。
4. 删除员工信息该存储过程接收员工ID作为参数,然后使用DELETE语句将指定员工的信息从数据库中删除。
5. 查询员工薪水排名该存储过程使用RANK函数查询员工薪水排名,并返回结果。
6. 查询员工平均薪水该存储过程使用AVG函数计算员工的平均薪水,并返回结果。
7. 查询员工工资总和该存储过程使用SUM函数计算员工的工资总和,并返回结果。
8. 查询员工工龄该存储过程使用DATEDIFF函数计算员工的工龄,并返回结果。
9. 查询员工信息及其所在部门名称该存储过程使用JOIN语句连接员工表和部门表,查询员工信息及其所在部门名称,并返回结果。
10. 查询员工信息及其直接上级该存储过程使用自连接查询,查询员工信息及其直接上级的信息,并返回结果。
以上是10个符合要求的SQL Server存储过程例子。
它们可以用于实现各种不同的业务逻辑,提高数据库的性能和安全性。
通过合理使用存储过程,可以减少重复的代码编写,提高开发效率,同时还可以提高系统的可维护性和可扩展性。
SQLSERVER存储过程批量插入数据库表数据
SQLSERVER存储过程批量插⼊数据库表数据在做数据库系统开发时,特别是需要对数据库操作进⾏性能测试及优化时,我们就需要在数据库测试表中插⼊⼤量数据以便测试。
对于这些数据的插⼊,这⾥通过实例展⽰如何通过存储过程进⾏实现。
数据库表(userInfo)结构如下:CREATE TABLE[dbo].[userInfo] ([userID][int]IDENTITY (1, 1) NOT NULL ,[roleType][int]NULL ,[groupID][int]NULL ,[userCode][varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[userName][varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[text1][varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[text2][varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[text3][varchar] (50) COLLATE Chinese_PRC_CI_AS NULL) ON[PRIMARY]GO存储过程如下(这⾥是批量插⼊99000条数据,roleType,groupID两个字段为随机⽣成的0-5之间的数):CREATE PROCEDURE add_UserInfoASDECLARE@userCode VARCHAR(30)DECLARE@userName VARCHAR(30)DECLARE@userCode_base VARCHAR(30)DECLARE@count INTEGERDECLARE@index INTEGERDECLARE@rand1INTEGERDECLARE@rand2INTEGERSET@userCode_base='qs_'SET@userName='userName'SET@count=100000SET@index=10000WHILE@index<@countBEGINSET@userCode=@userCode_base+CONVERT(VARCHAR,@index)SET@rand1=convert(int,rand()*5)SET@rand2=convert(int,rand()*5)INSERT INTO userInfo (userCode,roleType,groupID,userName,text1,text2,text3)VALUES (@userCode,@rand1,@rand2,@userName,'aokei kaol jof','','aokei kaol jof')SET@index=@index+1ENDGO。
sqlserver sql 语句创建存储过程
sqlserver sql语句创建存储过程当在SQL Server中创建存储过程时,可以使用CREATE PROCEDURE语句。
这允许定义一个SQL查询的集合,并将其作为一个命名的存储过程保存在数据库中,下面是创建存储过程的详细介绍:创建一个简单的存储过程:CREATE PROCEDURE GetEmployeeDetailsASBEGINSELECT*FROM Employees;END;这个示例创建了一个名为GetEmployeeDetails的存储过程。
它不接受任何参数,仅执行了一个简单的SELECT查询,并返回Employees表中的所有数据。
创建带有参数的存储过程:CREATE PROCEDURE GetEmployeeByIDEmployeeID INTASBEGINSELECT*FROM Employees WHERE EmployeeID=EmployeeID;END;这个示例创建了一个名为GetEmployeeByID的存储过程,接受一个EmployeeID参数,并根据提供的EmployeeID来查询特定的员工信息。
创建带有输入和输出参数的存储过程:CREATE PROCEDURE CalculateTotalSalesStartDate DATE,EndDate DATE,TotalSales DECIMAL(18,2)OUTPUTASBEGINSELECTTotalSales=SUM(Amount)FROM SalesWHERE SaleDate BETWEENStartDate ANDEndDate;END;这个示例创建了一个名为CalculateTotalSales的存储过程。
它接受两个日期参数StartDate和EndDate,并使用TotalSales作为输出参数,计算在指定日期范围内的销售总额。
执行存储过程:一旦创建了存储过程,可以使用EXEC或EXECUTE来执行它:EXEC GetEmployeeDetails;--执行无参数的存储过程EXEC GetEmployeeByIDEmployeeID=123;--执行带参数的存储过程DECLARETotal DECIMAL(18,2);EXECCalculateTotalSalesStartDate='2023-01-01',EndDate='2023-12-31',TotalS ales=Total OUTPUT;SELECTTotal AS TotalSales;--执行带输入和输出参数的存储过程这些示例覆盖了基本的存储过程创建和执行过程。
sqlserver存储过程sql语句
"让我们来谈谈建立一个SQL Server存储的程序——这就像赋予你的数据库超级能力!你首先使用强大的CREATE程序声明,然后是程序的名称。
是时候通过指定其名称和数据类型来引入侧式——我的意思是输入参数。
CREATE程序数据客户 Id INT。
(英语)。
现在,这里会发生真正的动作——在程序内,你可以释放SQL语句的力量来进行各种惊人的操作,比如从表格中选择数据,更新记录,甚至勇敢地删除信息。
就像超级英雄总是有后备计划一样,重要的是在存储程序内使用适当的错误处理来解决任何可能阻碍你的问题。
穿上衣服,准备好创造一些史诗存储的程序!"
完成存储程序后,只需使用EXEC关键词和程序名称来运行。
也可以添加任何必要的输入参数。
您可以输入 EXEC GetCustomeData 客户端指数=123。
通过在网络上发送较少的数据以及减少需要运行的单独的SQL语句数量,存储的程序可以使您的数据库更快。
他们也可以通过只允许您通过存储的程序访问数据,而不是直接询问表格来增加一层安全。
在从一个应用程序或另一个存储程序中援引一个存储程序时,必须利用产出参数或通过从存储程序修改的表格或观点中选择数据,有条不紊地获取结果。
极为重要的是仔细评估存储程序对综合数据库结构的影响,并努力确保为以后的维护和开发工作充分记录这些程序。
通过坚持最佳做法和有效利用存储程序,可以明显提高SQL Server数据库的效率、安全性和可维护性。
SQLServer列转行存储过程
SQLServer列转⾏存储过程--DROP PROCEDURE TableColToRowCREATE PROCEDURE TableColToRow@表名 VARCHAR(80),@哪字段转⾏ VARCHAR(80),@列转⾏后字段名 VARCHAR(80)ASBEGIN-------------------------------------------------------------------------------------------DECLARE@sql VARCHAR(8000)--@表名 VARCHAR(80),--@哪字段转⾏ VARCHAR(80),--@列转⾏后字段名 VARCHAR(80)--SET @表名 ='tba'--SET @哪字段转⾏ ='姓名'--SET @列转⾏后字段名='学科'--定义变量SET @sql=''SET @sql=@sql+ 'DECLARE @sTitle1 VARCHAR(8000),@sTitle2 VARCHAR(8000),@sTitle3 VARCHAR(8000),@sql2 varchar(max),@sTab VARCHAR(max) '+char(10)+char(10)--初始化变量SET @sql=@sql+ 'SELECT '+char(10)--SET @sql=@sql+ ' @sTitle1 =ISNULL(@sTitle1+'','','''')+ ''[''+['+ @哪字段转⾏ +']+'']'', '+char(10) --不转化数据为VARCHARSET @sql=@sql+ ' @sTitle1 =ISNULL(@sTitle1+'','','''')+'' convert(varchar(80),[''+CONVERT(VARCHAR(80),['+ @哪字段转⾏ +'])+'']) as ['' + CONVERT(VARCHAR(80),['+ @哪字段转⾏ +'])+'']'', '+char(10) --转化数据为VARCHAR SET @sql=@sql+ ' @sTitle2 =ISNULL(@sTitle2+'','','''')+''"''+CONVERT(VARCHAR(80),['+ @哪字段转⾏ +'])+''"'', '+char(10)SET @sql=@sql+ ' @sTitle3 =ISNULL(@sTitle3+'','','''')+'' max([''+CONVERT(VARCHAR(80),['+ @哪字段转⾏ +'])+'']) as ['' + CONVERT(VARCHAR(80),['+ @哪字段转⾏ +'])+'']'' '+char(10)SET @sql=@sql+ 'FROM ['+@表名+']'+char(10)SET @sql=@sql+char(10)--初始化pivot SqlSET @sql=@sql+ 'SELECT '+char(10)SET @sql=@sql+ '@sTab=ISNULL(@sTab+'' UNION '','''')+''select ''''''+name+'''''' AS ['+@列转⾏后字段名 +'],''+ @sTitle1 +'' from ['+@表名+'] pivot ( max([''+name+'']) for ['+@哪字段转⾏+'] in (''+@sTitle2+'')) a''+char(10) '+char(10) SET @sql=@sql+ 'FROM syscolumns WHERE ID=object_id('''+@表名+''') AND name<>'''+@哪字段转⾏+''' '+char(10)SET @sql=@sql+char(10)--⽣成列转⾏sql语句SET @sql=@sql+ 'Set @sql2='''' '+char(10)SET @sql=@sql+ 'Set @sql2=@sql2+'' select ['+ @列转⾏后字段名+'],''+@sTitle3+'' from( ''+char(10)+'' '' '+char(10)SET @sql=@sql+ 'Set @sql2=@sql2+@sTab '+char(10)SET @sql=@sql+ 'Set @sql2=@sql2+'' ) AS d GROUP BY ['+@列转⾏后字段名+'] '' '+char(10)--执⾏sql2脚本SET @sql=@sql+ 'exec(@sql2)'--显⽰sql2脚本--SET @sql=@sql+ 'print @sql2'--显⽰sql脚本--print @sqlexec(@sql)-------------------------------------------------------------------------------------------END------------------------------------原形---------------------------------------DECLARE @sTitle VARCHAR(8000),@sTitle2 VARCHAR(8000),@sTitle3 VARCHAR(8000),@sTab VARCHAR(8000),@sql2 VARCHAR(8000)--SELECT--@sTitle =ISNULL(@sTitle+',','')+ 姓名,--@sTitle2 =ISNULL(@sTitle2+',','')+'"'+姓名+'"',--@sTitle3 =ISNULL(@sTitle3+',','')+' max('+姓名+') as ' + 姓名--FROM tba--SELECT--@sTab=ISNULL(@sTab+' UNION ','')+'select '''+name+''' AS 学科,'+ @sTitle +' from tba pivot ( max('+name+') for 姓名 in ('+@sTitle2+')) a'+char(10)--FROM syscolumns WHERE ID=object_id('tba') AND name<>'姓名'--select 学科, max(张三) as 张三, max(李四) as 李四 from(-- select '语⽂' AS 学科,张三,李四 from tba pivot ( max(语⽂) for 姓名 in ("张三","李四")) a-- UNION select '数学' AS 学科,张三,李四 from tba pivot ( max(数学) for 姓名 in ("张三","李四")) a-- UNION select '物理' AS 学科,张三,李四 from tba pivot ( max(物理) for 姓名 in ("张三","李四")) a--) AS d GROUP BY 学科--------------------------------------------------------------------------------------------在sql server 2005下测试通过,pivot需要sql server2005以上版本⽀持---------------------------------调⽤⽅法------------------------------------EXEC dbo.TableColToRow@表名 = 'tba', -- varchar(80)@哪字段转⾏ = '姓名', -- varchar(80)@列转⾏后字段名 = '学科' -- varchar(80)。
sqlserver存储过程例子
sqlserver存储过程例子tSellOut tSellBackCREATE PROCEDURE CustomerTotal@CustomerlD i nt,@Begi nDate Datetime,@En dDate DatetimeASBeginSet NoCou nt OnDeclare @CustomerStocklO Table --临时表(fDate Datetime,fNote nvarchar(10),fNO n varchar(20),fFlag int not null default 0,fProductID int,fQty numeric(10,2),fUni tPrice numeric(10,2))In sert Into @CustomerStockIOSelect a.fSubmitDate,'出货',a.fNO,O,b.fReslD,b.fQty,b.fUnitPricefrom tSellOut a,tSellOutSub bwhere a.fID=b.fIDand a.fCustomerlD=@CustomerlDand a.fSubmitDate>=@Begi nDateand a.fSubmitDate<=@E ndDateIn sert Into @CustomerStockIOSelect a.fSubmitDate,'退货',a.fNO,1,b.fResID,-b.fQty,b.fUnitPricefrom tSellBack a,tSellBackSub bwhere a.fID=b.fIDand a.fCustomerID=@CustomerIDand a.fSubmitDate>=@Begi nDateand a.fSubmitDate<=@E ndDateSelect fProductID,sum(fQty)as fQty,sum(fU nitPrice)as fUni tPrice, sum(fQty*fU ni tPrice)as fSum from @CustomerStockIOgroup by fProductID order by fProductIDSet NoCou nt OFFEND/*设置返回的结果中含有关受Tran sact-SQL 语句影响的行数的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。