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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM