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
不过在我们写一些比较复杂的存储过程的时候,可能也会需要用到这些数据结构,但一般的数据库都没有提供这种数据结构类型.今天看到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 存储过程 变量赋值
- 存储过程中的top+变量(downmoon)sql
- Sql学习第一天――SQL 将变量定义为Table类型(虚拟表)
- SQL 存储过程入门(变量)
- Oracle PL/SQL之处理index不连续的table类型变量
- mssql:t-sql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程;触发器trigger
- SELECT 与 SET 对变量赋值的区别 存储过程 sql 2000(转载)
- SQL : 一个存储过程,用于向指定的MS SQL Table中导入CSV 格式的文件数据
- Oracle PL/SQL之处理index不连续的table类型变量
- mssql:t-sql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程
- Oracle PL/SQL之处理index不连续的table类型变量
- 存储过程分页又一方法(使用table变量)(摘)
- SQL 存储过程入门(变量)(二)
- 存储过程分页又一方法(使用table变量)
- SQL知识整理一:触发器、存储过程、表变量、临时表
- sql 实用存储过程[sp_table][sp_helpText]
- 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器
- sql server学习笔录1(sql存储过程,表变量的运用)
- oralce存储过程拼接sql字符串,并执行sql字符串给变量赋值
- 存储过程中将sql语句结果赋值给变量