您的位置:首页 > 数据库

SQL 存储过程 Table变量

2014-04-03 17:14 375 查看
在平时的编程中,总会需要用一些常用的数据结构,比如集合(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: