返回表是没有问题的.你看我的例子函数,返回的就是一个表集.--创建字符串分拆的函数 create function fsplit( @str varchar(8000) --要分拆的字符串 ,@spli varchar(10) --字符串分隔符 ) returns @re table(istr varchar(8000)) as begin declare @i int,@splen int select @splen=len(@spli) ,@i=charindex(@spli,@str) while @i>0 begin insert into @re values(left(@str,@i-1)) select @str=substring(@str,@i+@splen,8000) ,@i=charindex(@spli,@str) end if @str<>'' insert into @re values(@str) return end
如果要将函数结果做为查询语句中的一部分来使用,你就必须用访问表的方法来使用它. 比如,要利用上面的函数来查询: select * from 表 where treeid in(select * from dbo.fsplit('1,2,3,4',',')) --既然返回结果是表集,就要用表的方法去写.而不能写成: select * from 表 where treeid in dbo.fsplit('1,2,3,4',',') --这个写法就错了.
create function f_name (@id int)
returns int
as
return @id
go
执行:
select dbo.f_name(是int的字段) from tableName
然后构成一个where条件 TreeId in (1,2,3,4), TreeId列是整数类型。
这样我就可以在实现在查询记录集时
用一条sql语句就可以实现判断某列所代表的树节点是否在允许的某棵变化的子树上了。
当然,这条sql语句是相当复杂了。
我以前试过用函数返回一个字符串,形如“1,2,3,4”的,但是这样sql server会报
类型不匹配的错误。于是才想到用函数返回一个表。
但是没想到这时传递列作为函数参数不行,所以才想问大家怎么能够把列作为参数
传递给表值函数(一般类型的返回值函数是没有问题的,这我也试过。)
create function fsplit(
@str varchar(8000) --要分拆的字符串
,@spli varchar(10) --字符串分隔符
)
returns @re table(istr varchar(8000))
as
begin
declare @i int,@splen int
select @splen=len(@spli)
,@i=charindex(@spli,@str)
while @i>0
begin
insert into @re values(left(@str,@i-1))
select @str=substring(@str,@i+@splen,8000)
,@i=charindex(@spli,@str)
end
if @str<>'' insert into @re values(@str)
return
end
比如,要利用上面的函数来查询:
select * from 表
where treeid in(select * from dbo.fsplit('1,2,3,4',',')) --既然返回结果是表集,就要用表的方法去写.而不能写成:
select * from 表 where treeid in dbo.fsplit('1,2,3,4',',') --这个写法就错了.