SqlServer里边能否存储全局表变量?

linkyou 2005-03-28 11:17:41
实际问题是这样的,以下函数用于返回一个树目录所有子孙节点的字符串,但我现在希望放回一张
该目录所有子孙节点记录的记录集和他们的深度,请问如何做,我想应该是申请一个全局表变量
然后在遍历的时候往表变量里边插入记录,但是我不知道如何申请全局表变量
Create FUNCTION KMTreeClass(@InputId int,@IdStr varchar(8000)='')
RETURNS Varchar(8000)
AS
BEGIN
Declare @KM_CC int,@KM_UC int

DECLARE KM CURSOR local FOR
SELECT KM_CC,KM_UC
FROM KM
where KM_UC=@InputId

OPEN KM
FETCH NEXT FROM KM
INTO @KM_CC,@KM_UC

WHILE @@FETCH_STATUS = 0
BEGIN
if @IdStr<>'' select @IdStr=','+@IdStr
select @IdStr=''''+cast(@KM_CC as varchar)+''''+@IdStr
if @@NESTLEVEL<32
select @IdStr=dbo.KMTreeClass(@KM_CC,@IdStr)
else
set @IdStr=@IdStr+'['+cast(@KM_CC as varchar)+']'
-- select KMCC = 5,level1 = 6 into #KM
-- drop table #KM
FETCH NEXT FROM KM
INTO @KM_CC,@KM_UC
End

CLOSE KM
DEALLOCATE KM

Return @IdStr

END

...全文
223 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
linkyou 2005-03-29
  • 打赏
  • 举报
回复
非常感谢老大,但是我要用游标+递归的方法得到表,因为用你这个方法我也想过,必须多次和tb表自身进行关联,那么消耗是不是比游标来得大呢?我是指查询效率,请看一下我的函数
天地客人 2005-03-28
  • 打赏
  • 举报
回复
没有直接的全局变量,你可以 通过其它方法实现,如:存入临时表中,或用自定义数据类型和函数据实现相应的功能
jacksom 2005-03-28
  • 打赏
  • 举报
回复
up
linkyou 2005-03-28
  • 打赏
  • 举报
回复
定义数据类型,还是定义全局变量呢?
NewQger 2005-03-28
  • 打赏
  • 举报
回复
函数 可以输出参数。
可以在用户定义数据类型 定义你的数据类型。
linkyou 2005-03-28
  • 打赏
  • 举报
回复
函数好像也不可以设置输出参数?是吗
linkyou 2005-03-28
  • 打赏
  • 举报
回复
Cannot access temporary tables from within a function.
wyb0026 2005-03-28
  • 打赏
  • 举报
回复
全局临时表 ##yourtablename
zjcxc 元老 2005-03-28
  • 打赏
  • 举报
回复
--树形数据查询示例
--作者: 邹建

if exists (select * from dbo.sysobjects where id = object_id(N'tb') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table tb
GO

--示例数据
create table tb(id int identity(1,1),pid int,name varchar(20))
insert tb select 0,'中国'
union all select 0,'美国'
union all select 0,'加拿大'
union all select 1,'北京'
union all select 1,'上海'
union all select 1,'江苏'
union all select 6,'苏州'
union all select 7,'常熟'
union all select 6,'南京'
union all select 6,'无锡'
union all select 2,'纽约'
union all select 2,'旧金山'
go



if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_cid]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_cid]
GO

/*--树形数据处理

查询指定id的所有子

--邹建 2003-12(引用请保留此信息)--*/

/*--调用示例

--调用(查询所有的子)
select a.*,层次=b.level from tb a,f_cid(2)b where a.id=b.id
--*/
create function f_cid(
@id int
)returns @re table(id int,level int)
as
begin
declare @l int
set @l=0
insert @re select @id,@l
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.id,@l
from tb a,@re b
where a.pid=b.id and b.level=@l-1
end
/*--如果只显示最明细的子(下面没有子),则加上这个删除
delete a from @re a
where exists(
select 1 from tb where pid=a.id)
--*/
return
end
go

--调用(查询所有的子)
select a.*,层次=b.level from tb a,f_cid(2)b where a.id=b.id
go

--删除测试
drop table tb
drop function f_cid

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧