您的位置:首页 > 数据库

sql 存储过程基础

2016-06-15 19:09 260 查看
1.存储过程,触发器等内部不能有GO

常用系统存储过程有:

exec sp_databases; --查看数据库
exec sp_tables;        --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
exec sp_rename student, stuInfo;--修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;


(1)程序中的打印,及普通方法的使用

print  ‘XXXXX’

------------------------------------------------
declare @YYYY nvarchar(4)
declare @MM   nvarchar(2)
declare @dd   nvarchar(2)
declare @_FirstTime DateTime
declare @_LastTime  DateTime

-------函数的使用-----------
set @YYYY = year(getdate())
set @MM   = month(getdate())
set @dd   = day(getdate())

set @_FirstTime = cast(@YYYY + '-' + @MM + '-' + @dd + ' 00:00:00' as DateTime)
set @_LastTime  = cast(@YYYY + '-' + @MM + '-' + @dd + ' 23:59:59' as DateTime)


(2)声明,创建1个表

DECLARE @Result TABLE(NumberStr NVARCHAR(100), HeadImg NTEXT, CreateDate DATETIME)
//插入
INSERT INTO @Result(NumberStr, HeadImg, CreateDate)
SELECT NumberStr, ISNULL([Image],''), CreateDate
FROM TB_Check a
WHERE UserID=CAST(@_UserID AS NVARCHAR(100)) AND   [Type]=0
--AND RegisId =@_RegisId

SELECT NumberStr, HeadImg, CreateDate
FROM @Result
ORDER BY NumberStr,CreateDate


(3) 程序中的逻辑判断

@BeginCallDate varchar(50),
@EndCallDate varchar(50),
@LogType varchar(50),
@UserName varchar(50)
as
begin
declare @strWhere varchar(500)
set @strWhere='1=1 '
//---------------------------
if(@BeginCallDate!='' and @EndCallDate='')
begin
set @strWhere=@strWhere+' and CallDate>='''+cast(@BeginCallDate as varchar(50))+''''
end
//--------------------------------
if(@BeginCallDate='' and @EndCallDate!='')
begin
set ....................
end
//--------------------------------------------
if(@BeginCallDate!='' and @EndCallDate!='')
begin
......................
end

exec(@strSql)
end


(4)打开游标 关闭游标

open cur_CommByXzByds ---打开游标
//结束片段关闭
close cur_CommByXzByds


(5)局部变量赋值 并返回

begin
declare @VideoTimes int;
declare @ExamTimes int
declare @ExamMark int
//将结果赋值给VideoTimes
select @VideoTimes = ISNULL(Sum(TimeCount), 0)
from tb_VideoPlayNotes  where..
//赋值结果
select @ExamMark = ISNULL(Max(MankCount), 0),
@ExamTimes = ISNULL(Sum(TimeCount), 0)
from tb_ExamTable where ....
//拼接返回结果
select (@VideoTimes + @ExamTimes) as TimesCount, @ExamMark as ExamMark
end


1.创建

无参数

if (exists (select * from sys.objects where name = 'XXX'))
drop proc XXX
go
create proc XXX
as
//begin 和 end 是一对,不可以只写其中一个,但可以都不写
begin
select * from student;
end
--调用、执行存储过程
exec proc_get_student;


带参数

create proc | procedure pro_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
....

create proc XXX(@A   int, @B  int)
as
..........   @A and @B
go

//执行
exec XXX   1, 10; //后面的是参数

//也可以带上参数名称
exec XXX  @A=1 ,@B=10


局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}

局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}

局部变量的显示:select @变量名

create proc XXX
as
declare @sname varchar(100)
set @sname=(select Sname from student where S#=01)
//显示局部变量
select @sname
go

exec StuProc


参数带通配符

create proc XXX(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
as
select.... where name like @name and name like @nextName;
go

exec proc_findStudentByName;
exec proc_findStudentByName '%o%', 't%';


带输出参数的

create proc XXX(
@id int, --默认输入参数
@name varchar(20) out, --输出参数
@age varchar(20) output--输入输出参数
)
as
........
go

//调用

declare @id int,
@name varchar(20),
@temp varchar(20);
set @id = 7;
set @temp = 1;
exec XXX @id, @name out, @temp output;
//返回的2个参数
select @name, @temp;
print @name + '#' + @temp;


不缓存 存储过程

--WITH RECOMPILE 不缓存

create proc proc_temp
with recompile   //缓存
as

go

exec proc_temp;


带游标参数

if (object_id('proc_cursor', 'P') is not null)
drop proc proc_cursor
go
create proc proc_cursor
@cur cursor varying output
as
set @cur = cursor forward_only static for
select id, name, age from student;
open @cur;
go
--调用
declare @exec_cur cursor;
declare @id int,
@name varchar(20),
@age int;
exec proc_cursor @cur = @exec_cur output;--调用存储过程
fetch next from @exec_cur into @id, @name, @age;
while (@@fetch_status = 0)
begin
fetch next from @exec_cur into @id, @name, @age;
print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);
end
close @exec_cur;
deallocate @exec_cur;--删除游标
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 sql