zoukankan      html  css  js  c++  java
  • SQL基础系列(3)-变量、函数、存储过程等

    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           N'zcx'  -- name - nvarchar(50)
    22 
    23           )
    24 
    25          INSERT INTO @mytable
    26 
    27                  ( id, name )
    28 
    29          VALUES  ( 0, -- id - int
    30 
    31                    N'zjj'  -- 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

  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/zijiyanxi/p/5572314.html
Copyright © 2011-2022 走看看