关于表值函数的参数传递问题——为什么不能传递列名作为参数
我写了一个表值函数,参数是一个int类型的参数,当我传递一个类型是int的
列的名称给函数作为参数时无法通过编译,但传递一个数字可以。
请问各位大虾,我该怎么办?
问题点数:100、回复次数:10Top
1 楼pengdali()回复于 2003-09-04 18:09:13 得分 20
create proc 过程名 (@列名 varchar(100))
as
exec('select '+@列名+' from 表名')
go
--调用:
exec 过程名 'aaa'Top
2 楼pengdali()回复于 2003-09-04 18:26:22 得分 20
函数内不能用exec,你可以这样用过程:
create table #临时表 (结构和返回结构相同)
insert #临时表 exec 你的过程 '参数'
select * from #临时表Top
3 楼yujohny(踏网无痕)回复于 2003-09-04 19:17:28 得分 0
大力回答的真快!!
Top
4 楼txlicenhe(马可)回复于 2003-09-04 19:54:38 得分 0
大力根本就不给别人机会。Top
5 楼nboys()回复于 2003-09-04 20:10:24 得分 20
create function f_name (@id int)
returns int
as
return @id
go
执行:
select dbo.f_name(是int的字段) from tableNameTop
6 楼zjcxc(邹建)回复于 2003-09-04 20:24:25 得分 0
不太理解楼主的意思Top
7 楼infinite()回复于 2003-09-04 21:22:45 得分 0
谢谢各位的回答,不过还是没有满足我的需求。
我这个函数之所以要返回一个表,其实我是想返回一个类似于(1,2,3,4)的东西,
然后构成一个where条件 TreeId in (1,2,3,4), TreeId列是整数类型。
这样我就可以在实现在查询记录集时
用一条sql语句就可以实现判断某列所代表的树节点是否在允许的某棵变化的子树上了。
当然,这条sql语句是相当复杂了。
我以前试过用函数返回一个字符串,形如“1,2,3,4”的,但是这样sql server会报
类型不匹配的错误。于是才想到用函数返回一个表。
但是没想到这时传递列作为函数参数不行,所以才想问大家怎么能够把列作为参数
传递给表值函数(一般类型的返回值函数是没有问题的,这我也试过。)Top
8 楼zjcxc(邹建)回复于 2003-09-04 21:29:49 得分 20
返回表是没有问题的.你看我的例子函数,返回的就是一个表集.
--创建字符串分拆的函数
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
Top
9 楼zjcxc(邹建)回复于 2003-09-04 21:32:44 得分 20
如果要将函数结果做为查询语句中的一部分来使用,你就必须用访问表的方法来使用它.
比如,要利用上面的函数来查询:
select * from 表
where treeid in(select * from dbo.fsplit('1,2,3,4',',')) --既然返回结果是表集,就要用表的方法去写.
而不能写成:
select * from 表 where treeid in dbo.fsplit('1,2,3,4',',') --这个写法就错了.
Top
10 楼infinite()回复于 2003-09-05 08:24:33 得分 0
哎,看来你们还是没有搞懂我到底要问什么,看看标题吧。
不过谢谢各位了。Top




