码迷,mamicode.com
首页 > 数据库 > 详细

SQL基础系列(3)-变量、函数、存储过程等

时间:2016-06-09 14:47:23      阅读:385      评论:0      收藏:0      [点我收藏+]

标签:

1.    变量

 1 定义变量
 2 
 3 DECLARE @a INT
 4 
 5 赋值
 6 
 7 SET @a=1
 8 
 9 PRINT @a
10 
11 DECLARE @name NVARCHAR(30)
12 
13 --select 赋值
14 
15 SELECT @name=zcx
16 
17 PRINT @name
18 
19 SELECT @name=FirstName FROM dbo.Persons
20 
21 PRINT @name
22 
23  
24 
25 DECLARE @name NVARCHAR(50)
26 
27 --update 赋值
28 
29 UPDATE  Persons
30 
31 SET     @name = FirstName
32 
33 WHERE   ID = 1
34 
35 PRINT @name

 

 

2.    临时表

 

--创建临时表1

 1 create table #persion
 2 
 3 (
 4 
 5      [id] [int]  NOT NULL,
 6 
 7      [name] [nvarchar](5) NOT NULL,
 8 
 9      [pwd] [nvarchar](20) NULL
10 
11 )
12 
13  
14 
15 insert into #persion values(1,zcx,123)
16 
17  
18 
19 SELECT * INTO #psersion1 FROM #persion
20 
21 select * from #persion UNION ALL select * from #psersion1
22 
23  
24 
25 DROP TABLE #persion
26 
27 DROP TABLE #psersion1

 

 

 

插入select的数据

insert into #persion select id,FirstName,LastName from dbo.Persons

 

注意和select into的区别

Select into 会创建新的临时表

 

修改临时表结构

alter table #persion add [tmpid] int NOT NULL IDENTITY(10,1)

alter table #persion add [tmpid1] uniqueidentifier NOT NULL default(newid())

                                                                          

 

给查询结果集增加自增长列

 

要求主表Persons没得主键

select IDENTITY(int,1,1)as ID, * into #temp from Persons

SELECT * FROM #temp

 

和count性质类似

select SUM(1) from Persons

 

有主键的表添加列

select (select SUM(1) from Persons where id<= a.id) as myID,* from Persons a order by myID

 

创建表变量:下面代码要同时执行

 1 declare @mytable table
 2 
 3 (
 4 
 5     id int not null,
 6 
 7     name nvarchar(50) null
 8 
 9 )
10 
11  
12 
13  
14 
15 INSERT INTO @mytable
16 
17         ( id, name )
18 
19 VALUES  ( 0, -- id - int
20 
21           Nzcx  -- name - nvarchar(50)
22 
23           )
24 
25          INSERT INTO @mytable
26 
27                  ( id, name )
28 
29          VALUES  ( 0, -- id - int
30 
31                    Nzjj  -- name - nvarchar(50)
32 
33                    )
34 
35  
36 
37 select * from @mytable

 

 

3.    循环

 

 1 DECLARE @index INT
 2 
 3 DECLARE @resukt INT
 4 
 5 SET @index = 1
 6 
 7 SET @resukt = 0
 8 
 9 WHILE @index <= 100
10 
11     BEGIN
12 
13         SET @resukt += @index
14 
15         SET @index += 1
16 
17     END
18 
19 PRINT @resukt

 

 

4.    条件

 

 1 IF ( 3 > 5 )
 2 
 3     BEGIN
 4 
 5         PRINT true
 6 
 7     END
 8 
 9 ELSE
10 
11     BEGIN
12 
13         PRINT false
14 
15     END
16 
17  
18 
19 When then
20 
21 DECLARE @num INT
22 
23 DECLARE @name NVARCHAR(30)
24 
25 SET @num = 3
26 
27 SET @name = CASE WHEN @num = 1 THEN elephant
28 
29                  WHEN @num = 2 THEN hippo
30 
31                  WHEN @num = 3 THEN trigger
32 
33                  ELSE false
34 
35             END
36 
37 PRINT @name

 

 

5.    游标

原则上尽量不要使用游标

(更多信息:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html)

DECLARE @name NVARCHAR(30)

DECLARE mycursor CURSOR FOR SELECT FirstName FROM dbo.Persons

--打开游标

 1 OPEN mycursor
 2 
 3 WHILE @@FETCH_STATUS=0
 4 
 5 BEGIN
 6 
 7     FETCH NEXT FROM mycursor INTO @name
 8 
 9     PRINT @name
10 
11 END
12 
13 CLOSE mycursor
14 
15 --回收
16 
17 DEALLOCATE mycursor

 

 

 

6.    触发器

触发器中的临时表:

 

  Inserted

  存放进行insert和update 操作后的数据

  Deleted

存放进行delete 和update操作前的数据

 

 1 Create trigger persion_update
 2 
 3     On dbo.Persons
 4 
 5     for Update
 6 
 7 As
 8 
 9     declare @msg nvarchar(50)
10 
11     --@msg记录修改情况
12 
13     select @msg = N姓名从“ + Deleted.FirstName + N”修改为“ + Inserted.FirstName +  from Inserted,Deleted
14 
15     --插入日志表
16 
17     insert into TAB(Col2)values(@msg)

 

 

7.    存储过程

 

 1 DROP PROCEDURE compute_add
 2 
 3 CREATE PROCEDURE compute_add
 4 
 5     @p1 INT ,
 6 
 7     @p2 INT ,
 8 
 9     @p3 INT OUTPUT
10 
11 AS
12 
13     BEGIN
14 
15         SET @p3=@p1+@p2
16 
17     END
18 
19  
20 
21     DECLARE @result INT
22 
23     EXEC compute_add 1,2,@result OUTPUT
24 
25     PRINT @result

 

 

8.    函数

标量函数

 1 CREATE FUNCTION COMPUTE_ADD ( @p1 INT, @p2 INT )
 2 
 3 RETURNS INT
 4 
 5 AS
 6 
 7     BEGIN
 8 
 9         RETURN @p1+@p2
10 
11     END

 

 

调用方式

DECLARE @result INT

SET @result=dbo.COMPUTE_ADD(1,2)

PRINT @result

 

 

表值函数

 

 1 CREATE FUNCTION mytable ( @id INT )
 2 
 3 RETURNS TABLE
 4 
 5 AS
 6 
 7 RETURN
 8 
 9     ( SELECT    *
10 
11       FROM      dbo.Persons
12 
13       WHERE     id < @id
14 
15     )

 

 

调用方式

    select * from dbo.mytable(3)

 

 

表值函数:返回指定的列

 1 CREATE FUNCTION mytable ( @id INT )
 2 
 3 RETURNS @table TABLE
 4 
 5     (
 6 
 7       firstname NVARCHAR(50) ,
 8 
 9       lastname NVARCHAR(50)
10 
11     )
12 
13 AS
14 
15     BEGIN
16 
17         INSERT  INTO @table
18 
19                 SELECT  firstname ,
20 
21                         lastname
22 
23                 FROM    dbo.Persons
24 
25                 WHERE   id < @id
26 
27         RETURN
28 
29 END

 

 

调用方式

    select * from dbo.mytable(3)

 

函数和存储过程区别

 

函数

存储过程

可以返回表变量

不能返回表变量

不能使用output参数

可以使用output参数

不能用临时表

可以执行对数据库表的操作,可以返回数据集

函数内部的操作不能影响到外部环境

 

不能通过select返回结果集

 

不能update,delete,数据库表(在函数内对带副作用的运算符 ‘UPDATE‘ 的使用无效。)

 

必须return 一个标量值或表变量或空

可以return一个标量值,也可以省略return

SQL基础系列(3)-变量、函数、存储过程等

标签:

原文地址:http://www.cnblogs.com/zijiyanxi/p/5572314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!