• SQL 存储过程 Table变量


    在平时的编程中,总会需要用一些常用的数据结构,比如集合(Set),堆栈(Stack),队列(Queue). 而且现在很多的语言也提供了这样的库方便使用
    不过在我们写一些比较复杂的存储过程的时候,可能也会需要用到这些数据结构,但一般的数据库都没有提供这种数据结构类型.今天看到SQL Server 支持定义零时的表类型。而表类型是一个二维的集合,可以用来实现一些常用的数据结构。
    比如我们要实现堆栈
    Declare

    @StatckTable table(dataValue nvarchar(50)notnull, position intnotnull)

    Declare

    @curPos int

    set

    @CurPos = 0

    set

    @CurPos = @CurPos + 1

    insert

    into @StatckTable (dataValue,position)values(@yourValue,@CurPos)

    If

    @CurPos > 0

    Begin

    select @yourValue=dataValue from @StatckTable where position=@CurPosdeletefrom @StatckTable whereposition=@CurPosset @CurPos = @CurPos-1

    End
     
    以上内容纯属YY,实际使用中可能很少会用到,因为一般的应用程序通过调用SQL语言实现很多功能可能要比通过存储过程来的简单易懂。
     
    应用场景(Scenario)
    比如我们在数据库中用一张表存储了一个树形结构,该表如下
    MyTreeTbl ( Id int primary key, Parent Id Not NULL)
    如果ParentId=0代表是根结点
    现在需要实现一个功能,输入参数是一个结点的Id,要求输出该结点的所有子结点(包括其孙子结点以及孙孙孙。。子结点)
    如果通过程序调用SQL语言来实现的话。只要Select * from ParentId = @Id 然后递归调用一些就可以了,不过通过存储过程的话,需要用到Table类型的变量了,我还没没想到其他方法,孤陋寡闻了。
    Create

    PROCEDURE [dbo].[MyTest]

      @Id

    int

    AS
    BEGIN

    declare @tempTbl table(Id intNotNULL, bFound bitNotNull)declare @Count intinsertinto @tempTbl (Id,bFound)values(@Id, 0)set @Count = 1

     

    while @Count > 0Begin

     

    Selecttop 1 @Id = Id from @tempTbl Where bFound=0update @tempTbl set bFound=1 whereId=@Idinsertinto @tempTbl Select Id, bFound=0 from MyTreeTbl Where ParentId = @Idselect@Count=Count(*)from @tempTbl where bFound=0Endselect*from MyTreeTbl where Id in(select Id from@tempTbl)

    END
  • 相关阅读:
    05 . Python入门值循环语句
    04 . kubernetes资源清单YAML入门
    04 . Python入门之条件语句
    03 . Python入门之运算符
    05 . k8s实战之部署PHP/JAVA网站
    02 . Python之数据类型
    01 . Python简介
    04 . Mysql主从复制和Mycat读写分离
    03 . MysSQL权限和备份
    02 . Mysql基础操作及增删改查
  • 原文地址:https://www.cnblogs.com/kevin1988/p/3643494.html
Copyright © 2020-2023  润新知