sqlserver存储过程语法

一 、注释

    1. --   单行注释,从这到本行结束为注释,类似C++,c#中 //

      2. /* … */   多行注释,类似C++C#中    /* … */     

二、变量

      1.数据类型

          第一大类:整数数据

bit:bit数据类型代表0,1或NULL,就是表示true,false.占用1byte.
int:以4个字节来存储正负数.可存储范围为:-2^31至2^31-1.
smallint:以2个字节来存储正负数.存储范围为:-2^15至2^15-1
tinyint: 是最小的整数类型,仅用1字节,范围:0至此^8-1


第二大类:精确数值数据

numeric:表示的数字可以达到38位,存储数据时所用的字节数目会随着使用权用位数的多少变化.
decimal:和numeric差不多


第三大类:近似浮点数值数据

float:用8个字节来存储数据.最多可为53位.范围为:-1.79E+308至1.79E+308.
real:位数为24,用4个字节,数字范围:-3.04E+38至3.04E+38


第四大类:日期时间数据

datatime:表示时间范围可以表示从1753/1/1至9999/12/31,时间可以表示到3.33/1000秒.使用8个字节.
smalldatetime:表示时间范围可以表示从1900/1/1至2079/12/31.使用4个字节.


第五大类:字符串数据

char:长度是设定的,最短为1字节,最长为8000个字节.不足的长度会用空白补上.
varchar:长度也是设定的,最短为1字节,最长为8000个字节,尾部的空白会去掉.
text:长宽也是设定的,最长可以存放2G的数据.


第六大类:Unincode字符串数据

nchar:长度是设定的,最短为1字节,最长为4000个字节.不足的长度会用空白补上.储存一个字符需要2个字节.
nvarchar:长度是设定的,最短为1字节,最长为4000个字节.尾部的空白会去掉.储存一个字符需要2个字节.
ntext:长度是设定的,最短为1字节,最长为2G.尾部的空白会去掉,储存一个字符需要2个字节.


第七大类:货币数据类型

money:记录金额范围为:-92233720368577.5808至92233720368577.5807.需要8 个字节.
smallmoney:记录金额范围为:-214748.3648至214748.36487.需要4个字节.


第八大类:标记数据

timestamp:该数据类型在每一个表中是唯一的!当表中的一个记录更改时,该记录的timestamp字段会自动更新.
uniqueidentifier:用于识别数据库里面许多个表的唯一一个记录.


第九大类:二进制码字符串数据

binary:固定长度的二进制码字符串字段,最短为1,最长为8000.
varbinary:与binary差异为数据尾部是00时,varbinary会将其去掉
image:为可变长度的二进制码字符串,最长2G.

2.申明变量

DECLARE

{

{@local_variable data_type}

} [,...n]

例如:

declare @ID int --申明一个名为@ID的变量,类型为int

3.打印变量

PRINT @ID

三、语句块:Begin … end

将多条语句作为一个块,类似与C++C#中的{ }

四、比较操作符

? > (greater than).

? < (less than).

? = (equals).

? <= (less than or equal to).

? >= (greater than or equal to).

? != (not equal to).

? <> (not equal to).

? ! < (not less than).

? !> (not greater than).

.事务

语法:

BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable]

例如

BEGIN TRAN

-- 做某些操作,例如Insert into …

if @@error <> 0

BEGIN

ROLLBACK TRAN

END

else

BEGIN

COMMIT TRAN

END

六、游标

我们可以在存储过程中用Select语句取出每一行数据进行操作,这就需要用到游标。

语法:

DECLARE cursor_name CURSOR

[LOCAL | GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]

[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]

[TYPE_WARNING]

FOR select_statement

[FOR UPDATE [OF column_name [,...n]]]

例如:

DECLARE @au_id varchar(11), @au_fname varchar(20) –申明变量

--申明一个游标

DECLARE authors_cursor CURSOR FOR

SELECT au_id, au_fname FROM authors

--打开游标

OPEN authors_cursor

--取出值

FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname

--循环取出游标的值

WHILE @@FETCH_STATUS = 0

BEGIN

Print @au_id

Print @au_fname

Print ‘ ’

FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname

END

CLOSE authors_cursor –关闭游标

DEALLOCATE authors_cursor --释放游标

  

实例:

SQLSERVER存储过程基本语法 
一、定义变量 
--简单赋值  
declare @a int 
set @a=5  
print @a  

--使用select语句赋值  
declare @user1 nvarchar(50)  

select @user1='张三' 
print @user1  
declare @user2 nvarchar(50)  
select @user2 = Name from ST_User where ID=1  
print @user2  
   
--使用update语句赋值  
declare @user3 nvarchar(50)  
update ST_User set @user3 = Name where ID=1  
print @user3 

二、表、临时表、表变量
--创建临时表1  
create table #DU_User1  
(  
     [ID] [int]  NOT NULL,  
     [Oid] [int] NOT NULL,  
     [Login] [nvarchar](50) NOT NULL,  
     [Rtx] [nvarchar](4) NOT NULL,  
     [Name] [nvarchar](5) NOT NULL,  
     [Password] [nvarchar](max) NULL,  
     [State] [nvarchar](8) NOT NULL 
);  
--向临时表1插入一条记录  
insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');  
   
--从ST_User查询数据,填充至新生成的临时表  
select * into #DU_User2 from ST_User where ID<8  
   
--查询并联合两临时表  
select * from #DU_User2 where ID<3 union select * from #DU_User1  
   
--删除两临时表  
drop table #DU_User1  
drop table #DU_User2 

--创建临时表  
CREATE TABLE #t  
(  
    [ID] [int] NOT NULL,  
    [Oid] [int] NOT NULL,  
    [Login] [nvarchar](50) NOT NULL,  
    [Rtx] [nvarchar](4) NOT NULL,  
    [Name] [nvarchar](5) NOT NULL,  
    [Password] [nvarchar](max) NULL,  
    [State] [nvarchar](8) NOT NULL,  
)  
   
--将查询结果集(多条数据)插入临时表  
insert into #t select * from ST_User  
--不能这样插入  
--select * into #t from dbo.ST_User  
   
--添加一列,为int型自增长子段  
alter table #t add [myid] int NOT NULL IDENTITY(1,1)  
--添加一列,默认填充全球唯一标识  
alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())  
   
select * from #t  
drop table #t 
--给查询结果集增加自增长列  
   
--无主键时:  
select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User  
select * from #t  
   
--有主键时:  
select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID 
--定义表变量  
declare @t table 
(  
    id int not null,  
    msg nvarchar(50) null 
)  
insert into @t values(1,'1')  
insert into @t values(2,'2')  
select * from @t 
 三、循环
--while循环计算1到100的和  
declare @a int 
declare @sum int 
set @a=1  
set @sum=0  
while @a<=100  
begin 
    set @sum+=@a  
    set @a+=1  
end 
print @sum 
四、条件语句
--if,else条件分支  
if(1+1=2)  
begin 
    print '对' 
end 
else 
begin 
    print '错' 
end 
   
--when then条件分支  
declare @today int 
declare @week nvarchar(3)  
set @today=3  
set @week=case 
    when @today=1 then '星期一' 
    when @today=2 then '星期二' 
    when @today=3 then '星期三' 
    when @today=4 then '星期四' 
    when @today=5 then '星期五' 
    when @today=6 then '星期六' 
    when @today=7 then '星期日' 
    else '值错误' 
end 
print @week 

五、游标
declare @ID int 
declare @Oid int 
declare @Login varchar(50)  
   
--定义一个游标  
declare user_cur cursor for select ID,Oid,[Login] from ST_User  
--打开游标  
open user_cur  
while @@fetch_status=0  
begin 
--读取游标  
    fetch next from user_cur into @ID,@Oid,@Login  
    print @ID  
    --print @Login  
end 
close user_cur  
--摧毁游标  
deallocate user_cur 
六、触发器
  触发器中的临时表:
  Inserted 
  存放进行insert和update 操作后的数据 
  Deleted 
  存放进行delete 和update操作前的数据
--创建触发器  
Create trigger User_OnUpdate   
    On ST_User   
    for Update  
As  
    declare @msg nvarchar(50)  
    --@msg记录修改情况  
    select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '”' from Inserted,Deleted  
    --插入日志表  
    insert into [LOG](MSG)values(@msg)  
       
--删除触发器  
drop trigger User_OnUpdate 
七、存储过程
--创建带output参数的存储过程  
CREATE PROCEDURE PR_Sum  
    @a int,  
    @b int,  
    @sum int output 
AS 
BEGIN 
    set @sum=@a+@b  
END 
   
--创建Return返回值存储过程  
CREATE PROCEDURE PR_Sum2  
    @a int,  
    @b int 
AS 
BEGIN 
    Return @a+@b  
END 
       
--执行存储过程获取output型返回值  
declare @mysum int 
execute PR_Sum 1,2,@mysum output 
print @mysum  
   
--执行存储过程获取Return型返回值  
declare @mysum2 int 
execute @mysum2= PR_Sum2 1,2  
print @mysum2 
  
八、自定义函数
  函数的分类:
    1)标量值函数 
    2)表值函数
        a:内联表值函数
        b:多语句表值函数
    3)系统函数
  
--新建标量值函数  
create function FUNC_Sum1  
(  
    @a int,  
    @b int 
)  
returns int 
as 
begin 
    return @a+@b  
end 
   
--新建内联表值函数  
create function FUNC_UserTab_1  
(  
    @myId int 
)  
returns table 
as 
return (select * from ST_User where ID<@myId)  
   
--新建多语句表值函数  
create function FUNC_UserTab_2  
(  
    @myId int 
)  
returns @t table 
(  
    [ID] [int] NOT NULL,  
    [Oid] [int] NOT NULL,  
    [Login] [nvarchar](50) NOT NULL,  
    [Rtx] [nvarchar](4) NOT NULL,  
    [Name] [nvarchar](5) NOT NULL,  
    [Password] [nvarchar](max) NULL,  
    [State] [nvarchar](8) NOT NULL 
)  
as 
begin 
    insert into @t select * from ST_User where ID<@myId  
    return 
end 
   
--调用表值函数  
select * from dbo.FUNC_UserTab_1(15)  
--调用标量值函数  
declare @s int 
set @s=dbo.FUNC_Sum1(100,50)  
print @s  
   
--删除标量值函数  
drop function FUNC_Sum1 

 

猜你喜欢

转载自adla-bin.iteye.com/blog/1860346