我在工作中,根据项目中的需求,需要编写存储过程,进行对数据批量处理。根据在项目中运用的知识点,我简写一个存储过程的内容,以另一个场景将所运用到的知识写下来:
USE [B2C2] -- 使用B2C2数据库
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
/* 创建表值类型 clazz_Table */
CREATE TYPE clazz_Table AS TABLE
(
TEACHER varchar(128), -- 班主任
CLANO varchar(64), -- 班级编号
SEX char(8), -- 性别
NAME varchar(128), -- 姓名
AGE int, -- 年龄
STUNO int -- 学号
)
GO
CREATE PROCEDURE [dbo].[proc_test01]
(
-- 设置全局变量
@re_table clazz_Table READONLY,
@D_COUNT INT OUTPUT -- 输出参数
)
AS
BEGIN
-- 设置局部变量
DECLARE @D_TEACHER varchar(128); -- 班主任
DECLARE @D_CLANO varchar(64); -- 班级编号
DECLARE @D_SEX char(8); -- 性别
DECLARE @D_NAME varchar(128); -- 姓名
DECLARE @D_AGE int; -- 年龄
DECLARE @D_STUNO int; -- 学号
SET @D_COUNT = 0; -- 初始设置值为0
-- 声明一个游标
DECLARE myCursor CURSOR FOR SELECT TEACHER, CLANO, SEX, NAME, AGE, STUNO FROM @re_table;
-- 打开游标
OPEN myCursor;
-- 从游标中读取数据赋值到声明的6个变量中
FETCH NEXT FROM myCursor INTO @D_TEACHER, @D_CLANO, @D_SEX, @D_NAME, @D_AGE, @D_STUNO;
-- 判断游标的状态
-- 0 fetch语句成功
-- 1 fecthc语句失败或此行不在结果中
-- 2 被提取的行不存在
WHILE(@@FETCH_STATUS = 0) -- @@FETCH_STATUS为SQL Server数据库中内置的变量,可直接拿来使用。
BEGIN
-- 使用游标分条读取从Java代码端传递过来的clazz_Table数据
INSERT INTO t_clazz(teacher, clano, sex, name, age, stuno)
VALUES(@D_TEACHER, @D_CLANO, @D_SEX, @D_NAME, @D_AGE, @D_STUNO);
-- 用游标去取下一条记录
FETCH NEXT FROM myCursor INTO @D_TEACHER, @D_CLANO, @D_SEX, @D_NAME, @D_AGE, @D_STUNO;
END
-- 设置@D_COUNT的值
SET @D_COUNT = 1;
-- 关闭游标
CLOSE myCursor;
-- 撤销游标
DEALLOCATE myCursor;
END
GO