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

SQL 存储过程 Table变量,布布扣,bubuko.com

SQL 存储过程 Table变量

上一篇:linux设置定时运行脚本


下一篇:如何启动 SQL Server Agent(SQL Server 配置管理器)