当前位置:Gxlcms > 数据库问题 > SQL基础系列(3)-变量、函数、存储过程等

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

时间:2021-07-01 10:21:17 帮助过:3人阅读

定义变量 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)-变量、函数、存储过程等

标签:

人气教程排行