存储过程实例
来源:互联网 发布:网页美工实例教程 编辑:程序博客网 时间:2024/05/19 02:20
例1 传入一个参数@username,判断用户是否存在
-------------------------------------------------------------------------------
CREATE PROC IsExistUser
(
@username varchar(20),
@IsExistTheUser varchar(25) OUTPUT--输出参数
)
as
SELECT @IsExistTheUser = count(username)
FROM users
WHERE username = @username
GO
例2 存储过程结合事务的一个例子:添加用户,涉及到两个表,一个用户资料表,一个密码表:
增加用户
-------------------------------------------------------------------------------
create procedure AddUser
(
@username varchar(20),--用户名
@passwords varchar(18),--密码
@email varchar(100),--邮箱
@qq varchar(11),--QQ号码
@imageid int--头像
)
as
-- 设置NOCOUNT为ON,使不再返回统计信息(存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。)
SET NOCOUNT ON
DECLARE @CurrentError int
-- 创建事务, 插入数据到2个表
BEGIN TRANSACTION
-- 创建用户信息
INSERT INTO users (username, email, qq, imageid)
VALUES (@username, @email, @qq, @imageid)
select @CurrentError = @@Error
IF @CurrentError != 0
BEGIN
GOTO ERROR_HANDLER
END
-- 创建用户密码
INSERT INTO Signon (username, [password])
VALUES (@username, @passwords)
select @CurrentError = @@Error
IF @CurrentError != 0
BEGIN
GOTO ERROR_HANDLER
END
-- 结束事务
COMMIT TRANSACTION
-- 恢复NOCOUNT设置为OFF
SET NOCOUNT OFF
-- 返回0表示成功,其他则为失败
RETURN 0
-- 错误处理
ERROR_HANDLER:
ROLLBACK TRANSACTION
SET NOCOUNT OFF
RETURN @CurrentError
GO
3,SQL 获取当前时间
--获得当月天数
select day(dateadd(mm,1,getdate())-day(getdate())) as 本月天数 ;
select getdate() as 当前日期;
select day(getdate()) as 目前第几天;
select getdate()-day(getdate()) as 上个月最后一天; -- 减去了当前的天数
select dateadd(mm,1,getdate())-day(getdate()) as 加上一个月; -- 也就是这个月的最后一天
select day(dateadd(mm,1,getdate())-day(getdate())) as 获得当月天数;
4,转义字符:
WHERE ColumnA LIKE '%5/%%' ESCAPE '/'
5,使用实例
if (@@Error>0)
return -4
else
return @@Identity
set xact_abort on
begin tran t1
insert into Category(CategoryName) values(@CategoryName)
commit tran t1
ALTER PROCEDURE [dbo].[prCategory]
(
@CategoryID int=null, -- 类别ID
@CategoryName varchar(100)=null, -- 类别名称
@QuestionnaireIDs varchar(100)=null, -- 类别下的调查表ID
@Action int -- 1表示插入,@CategoryName 非空
-- 2表示更新,@CategoryID、@CategoryName 非空
-- 3表示删除,@CategoryID 非空
-- 4表示查询,@CategoryID 非空
-- 5表示查询所有记录
)
AS
BEGIN
declare @currentID int
-- 检查参数@Action
if (@Action is null or @Action<1 or @Action>5)
return
-- 插入记录
if (@Action=1)
begin
-- 检查参数@CategoryName是否为空
if (@CategoryName is null or len(@CategoryName)=0)
goto ParameterError
-- 检查记录是否存在
select @currentID=CategoryID from Category where CategoryName=@CategoryName
if (@CurrentID>0)
goto RowRepeatError
-- 插入记录
set xact_abort on
begin tran t1
insert into Category(CategoryName) values(@CategoryName)
commit tran t1
-- 返回插入行的标识列的列值
if (@@Error>0)
return -4
else
return @@Identity
end
-- 更新CategoryName字段值
else if (@Action=2)
begin
-- 检查参数@CategoryID是否有效
if (@CategoryID is null or len(@CategoryID)=0)
goto ParameterError
-- 检查参数@CategoryName是否为空
if (@CategoryName is null or len(@CategoryName)=0)
goto ParameterError
-- 检查记录是否存在
select @CurrentID=CategoryID from Category where CategoryID<>@CategoryID and CategoryName=@CategoryName
if (@CurrentID>0)
goto RowRepeatError
-- 更新记录
set xact_abort on
begin tran t2
update Category set CategoryName=@CategoryName where CategoryID=@CategoryID
commit tran t2
goto ReturnResult
end
-- 删除记录
else if (@Action=3)
begin
-- 检查参数@CategoryID是否有效
if (@CategoryID is null or @CategoryID<1)
goto ParameterError
-- 删除记录
set xact_abort on
begin tran t3
-- 删除子问题答案
delete from TextAnswer where QuestionID in (
select b.QuestionID from Question as a join Question as b on a.QuestionID=b.ParentQuestionID
where b.QuestionType=4 and a.QuestionnaireID in (
select QuestionnaireID from Questionnaire where CategoryID=@CategoryID
)
)
-- 删除问题答案
delete from TextAnswer where QuestionID in (
select QuestionID from Question where QuestionnaireID in (
select QuestionnaireID from Questionnaire where CategoryID=@CategoryID and QuestionType=4
)
)
-- 删除子问题答案
delete from ChoiceAnswer where QuestionID in (
select b.QuestionID from Question as a join Question as b on a.QuestionID=b.ParentQuestionID
where b.QuestionType<>4 and a.QuestionnaireID in (
select QuestionnaireID from Questionnaire where CategoryID=@CategoryID
)
)
-- 删除问题答案
delete from ChoiceAnswer where QuestionID in (
select QuestionID from Question where QuestionnaireID in (
select QuestionnaireID from Questionnaire where CategoryID=@CategoryID
)
)
-- 删除子问题
delete from Question where ParentQuestionID in (
select QuestionID from Question where QuestionnaireID in (
select QuestionnaireID from Questionnaire where CategoryID=@CategoryID and QuestionType<>4
)
)
-- 删除问题
delete from Question where QuestionnaireID in (
select QuestionnaireID from Questionnaire where CategoryID=@CategoryID
)
-- 删除调查问卷
delete from Questionnaire where CategoryID=@CategoryID
-- 删除组
delete from Category where CategoryID=@CategoryID
commit tran t3
goto ReturnResult
end
-- 根据@CategoryID查询记录
else if (@Action=4)
begin
-- 检查参数@CategoryID是否合法
if (@CategoryID is null or @CategoryID<1)
goto ParameterError
-- 查询记录
select * from Category where CategoryID=@CategoryID
goto ReturnResult
end
-- 查询所有记录
else if (@Action=5)
begin
-- 查询记录
select * from Category
goto ReturnResult
end
RowRepeatError:
return -2
ParameterError:
return -3
ReturnResult:
if (@@Error>0)
return -4
else
return 0
END
- 存储过程几个实例
- Mysql存储过程实例
- 存储过程经典实例
- 存储过程实例(一)
- 存储过程实例(二)
- ORcale 存储过程实例
- 存储过程 实例
- 存储过程实例
- Oracle 存储过程实例
- 存储过程知识点(实例)
- MySQL存储过程实例
- Mysql存储过程实例
- Oracle存储过程实例
- 存储过程实例
- MySQL存储过程实例
- Mysql存储过程实例
- 存储过程实例
- oracle 存储过程实例
- 如何在Windows下搭建Android开发环境
- 单例模式的三种实现方式:singleton
- URL重写
- linux tail 命令详解!Linux 文件内容查看工具介绍
- 《嵌入式linux应用程序开发完全手册》通用异步收发器UART学习笔记
- 存储过程实例
- 让vdsp与uclinux共舞(7):在内核为驱动预留空间
- Not live in vain——Leo关于生与死的感悟
- 对上传附件类的扩展——装饰模式
- C语言读文件
- jrtplib 分包处理
- Linux升级后OpenOffice没有反应
- 防火墙规则静态检测——FireWallRulesAnalyzer
- 端口查看命令