自定义函数中的问题,比较难!

拼命三朗 2007-08-13 09:02:51
一个自定义函数,有两个参数,一个传递表的名称,一个传递表内关键字值
函数功能是要根据参数返回指定表指定关键字的记录的字段值?
难点是:
因为查询语句必须是动态组建的,但是
函数中不支持Exec,
...全文
320 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
brother2605 2007-08-14
  • 打赏
  • 举报
回复
--在函数中使用动态语句需要使用exec sp_executesql来执行
CREATE FUNCTION ParentFullPath(@ParentTableName as varchar(50),@id as int)
RETURNS varchar(500) AS
BEGIN
declare @strSQL as varchar(500)
Declare @Val varchar(500),@RetVal varchar(50)
Set @RetVal=''
WHILE @id>0
BEGIN
set @strSQL='select @id1=FParentID from @ParentTableName1 where FID=cast(@id2 as varchar(10))'
--exec(@strSQL)--这样也不允许
-- 在函数中调用动态语句要使用sp_executesql
exec sp_executesql @strSQL,N'@id1 int output,@ParentTableName1 varchar(50),@id2 int',
@id1=@id output,@ParentTableName1=@ParentTableName,@id2=@id

--Select @id=FParentID,@Val=isnull(FName,'') From @ParentTableName Where FID=@id --这样不允许

if @id is null
Break
else
Set @RetVal=@Val+case when @RetVal<>'' then '\' else '' end + @RetVal
END
Return(@RetVal)
END
拼命三朗 2007-08-14
  • 打赏
  • 举报
回复
微软应该出个补丁,只要在自定义函数中允许执行动态的“select”语句就行了
hellowork 2007-08-14
  • 打赏
  • 举报
回复
存储过程是不能象函数那样在select中使用,所以才会让很多人头疼。。。
拼命三朗 2007-08-14
  • 打赏
  • 举报
回复
存储不能在select语句中使用啊,能像函数这样直接调用吗?
hellowork 2007-08-14
  • 打赏
  • 举报
回复
楼主的想法也是很多人梦寐以求的,但这样的需求无法用函数来完成,只能使用存储过程,请楼主不要再花费精力在函数上了。
拼命三朗 2007-08-14
  • 打赏
  • 举报
回复
根据brother2605(幽灵)的方法,我的自定义函数如下
CREATE FUNCTION ParentFullPath(@ParentTableName as varchar(50),@id as int)
RETURNS varchar(500) AS
BEGIN
Declare @strSQL nvarchar(800),@name nvarchar(500),@path varchar(50)
Set @path=''
WHILE @id>0
BEGIN
set @strSQL=N'select @id=FParentID,@name=FName from '+@ParentTableName+' where FID='+cast(@id as varchar(10))
execute sp_executesql @strSQL,N'@id int output,@name nvarchar(500) output',@id output,@name output
if @id is null
Break
else
Set @path=@name+case when @path<>'' then '\' else '' end + @path
END
Return(@path)
END
拼命三朗 2007-08-14
  • 打赏
  • 举报
回复
咳,好像没有xp_开头的类似xp_executesql 的存储过程啊
是不是我这个自定义函数就没辙了?
brother2605(幽灵)的方法是行不通的?可是编译通过的啊
hellowork 2007-08-14
  • 打赏
  • 举报
回复
这里所说的扩展存储过程是指xp_开头的存储过程,这样的扩展存储过程是动态链接库中的函数。
拼命三朗 2007-08-14
  • 打赏
  • 举报
回复
使用brother2605(幽灵)的方法,修改后,再调用该函数时出现如下错误

服务器: 消息 557,级别 16,状态 2,过程 ParentFullPath,行 9
只有函数和扩展存储过程才能从函数内部执行。

但是sp_executesql 就是扩展存储过程啊!哪位高手解释一下啊

chuwenqing 2007-08-13
  • 打赏
  • 举报
回复
mark
拼命三朗 2007-08-13
  • 打赏
  • 举报
回复
存储过程是可以有返回值,但是能像函数一样包含在select语句中么?
hellowork 2007-08-13
  • 打赏
  • 举报
回复
这样的问题已经有人问过多遍了,动态SQL需要使用EXEC,而至少在SQLSERVER2000中是无法用函数来解决的,只能使用存储过程.
拼命三朗 2007-08-13
  • 打赏
  • 举报
回复
我的函数代码
CREATE FUNCTION ParentFullPath(@ParentTableName as varchar(50),@id as int)
RETURNS varchar(500) AS
BEGIN
declare @strSQL as varchar(500)
Declare @Val varchar(500),@RetVal varchar(50)
Set @RetVal=''
WHILE @id>0
BEGIN
set @strSQL='select @id=FParentID from '+@ParentTableName+' where FID='+cast(@id as varchar(10))
--exec(@strSQL)--这样也不允许
--Select @id=FParentID,@Val=isnull(FName,'') From @ParentTableName Where FID=@id --这样不允许
if @id is null
Break
else
Set @RetVal=@Val+case when @RetVal<>'' then '\' else '' end + @RetVal
END
Return(@RetVal)
END

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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