• 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

  • 相关阅读:
    信息的封装和隐藏
    力扣 20. 有效的括号
    servlet执行原理
    当请求一个Servlet时,后台如何运作?
    req.getAttribute 和 req.getParameter
    Servlet 实现登录页面,并在条件下跳转
    request.getRequestDispatcher(a.jsp).forward(request,response)和response.sendRedirect的差别
    通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在
    Cocos2d-x 3.0 精灵帧缓存(SpriteFrameCache)
    lua 中处理cocos2dx 的button 事件
  • 原文地址:https://www.cnblogs.com/zijiyanxi/p/5572314.html
Copyright © 2020-2023  润新知