• 背景描述:满足一个过亿的客户端操作数据,且避免编写服务器端的程序管理;于是试试存储过程并记录从学习到遇到的坑

一、为啥使用存储过程

  • 官方给的定义 预编译SQL语句的集合,这些集合存储在一个名称下面,并作为一个单元处理。顾名思义就是把一段SQL语句合并成一个类似于C++中函数(Java中方法),直接给其他程序调用
  • 存储过程分类:系统存储过程、自定义存储过程(SQL语句集合)、扩展存储过程(编程语言写的)

二、自定义存储过程的创建

使用SSMS创建的存储过程模板

-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>   -- 设置存储过程的名称
	-- Add the parameters for the stored procedure here   以下添加存储过程的变量
	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON; --- 关闭计数,提高执行效率

    -- Insert statements for procedure here
	SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO

写个小案例,设计一个小表tUser,存储了下面信息

FIDFName
1A
2B
3C

CREATE PROCEDURE QueryName
	 @ID int = 1, --- 输入参数 int类型,默认数值是1
	 @Name NVARCHAR(255) out --- 输出参数,字符串(类似编程语言中引用)
AS
BEGIN
	SET NOCOUNT ON;

    -- 函数执行体
	 SELECT [FID],[FName]  FROM [dbo].[tUser]  WHERE FID = @ID 
	 return 1
	 END
GO

执行存储过程语句是

DECLARE	@return_value int,
		@Name nvarchar(255)

EXEC	@return_value = [dbo].[QueryName]
		@ID = 1,
		@Name = @Name OUTPUT

SELECT	@Name as N'@Name'

SELECT	'Return Value' = @return_value

执行结果是
查询结果
截止目前为止,了解了一个什么叫存储过程,和简单函数的框架的编写

三、自定义存储过程

声明变量、赋值变量
--- DECLARE  @+变量名称 变量类型
-- 注意变量一定要使用 @开始
DECLARE @Value  INT 
SET @Value=1   - - 赋值 方法一
SELECT @Value =1 -- 赋值方法二
数组变量

使用Table 变量存储数组;存储变量后,调用方式和表操作一样;数值不大的时候 尽可能使用表变量。数值比较大的时候 使用临时表

DECLARE @TmpRes TABLE (
				 [FName] [varchar](256) NULL
				,[FID]      int 
			 ) 
执行字符串拼接的语句
EXEC
 EXEC sp_executesql
DECLARE @SQLQueryMaxMin NVARCHAR(2000)
DECLARE @MaxValue NVARCHAR(255)
DECLARE @MinValue NVARCHAR(255)
									
 SET  @SQLQueryMaxMin = 'SELECT @MaxValue= MAX([FID]),@MinValue=MIN([FID])  FROM '+@ParamTableName					 						             
 EXEC sp_executesql  @SQLQueryMaxMin,N'@MaxValue VARCHAR(255) output ,@MinValue VARCHAR(255) output'
							 ,@MaxValue output
							 ,@MinValue output
执行循环语句

使用TOP 1循环

		WHILE EXISTS(SELECT [FID] FROM @TmpRes)
			BEGIN
				SELECT TOP(1)
					@[FID]=[[FID]]
				FROM @TmpRes	
--- 执行相关动作
			DELECT FROM @TmpRes WHERE FID=@FID

还可以使用 游程、设置只检索一行的方式执行

注意:学好基础的SQL语法和编程思想,自定义存储过程入门还是比较容易的

更多推荐