高手请进来指教(动态执行SQL并获取参数结果的问题)

liwenguang_2009 2010-08-07 05:41:32
本人使用的SQL版本为2005企业本。


首先看表结构

create table Kind+病历表
{
病历编号 int,
病历描述 nvarchar(200),
……
}

问题描述如下:
declare @FaultNums nvarchar(1000)
declare @Kind nvarchar(50)
declare @Discription nvarchar(1000)
declare @FaultNum nvarchar(10)
declare @Discriptions nvarchar(max)
set @FaultNums='41*46*64*66*67*68*69*71*73'
set @Kind='直流电动转辙机'
set @Discriptions=''
if @FaultNums is not null
begin
j1:
set @FaultNum=case when charindex('*',@FaultNums)>0 then substring(@FaultNums,1,charindex('*',@FaultNums)-1)
else @FaultNums
end
set @FaultNums=substring(@FaultNums,charindex('*',@FaultNums)+1,len(@FaultNums)-charindex('*',@FaultNums))
declare @sqls nvarchar(300)
set @sqls='select @a=病历描述 from ' + @Kind+'病历表 where 病历编号='+@FaultNum
print @sqls
exec sp_executesql @sqls,N'@a nvarchar(1000) output',@Discription output
set @Discriptions=@Discriptions+'$'+isnull(@Discription,'')
if (@FaultNum<>@FaultNums) goto j1
end
print @Discriptions




@FaultNums全是病历编号,由'*'分开。上面这段代码完成的功能是将@FaultNums中的所有编号对应成病历描述,最终显示出来。

上面这段代码是完全没有问题的。其中关键的地方就是,大家先注意下:
set @sqls='select @a=病历描述 from ' + @Kind+'病历表 where 病历编号='+@FaultNum
print @sqls
exec sp_executesql @sqls,N'@a nvarchar(1000) output',@Discription output




好,下面我想将这段代码封装成一个函数,用来实现根据参数获取结果:

函数如下:
create function [dbo].[GetFaultDiscription](@FaultNums nvarchar(1000),@Kind nvarchar(50))
returns nvarchar(max)
as
begin
declare @Discription nvarchar(1000)
declare @FaultNum nvarchar(10)
declare @Discriptions nvarchar(max)
set @Discriptions=''
if @FaultNums is not null
begin
j1:
set @FaultNum=case when charindex('*',@FaultNums)>0 then substring(@FaultNums,1,charindex('*',@FaultNums)-1)
else @FaultNums
end
set @FaultNums=substring(@FaultNums,charindex('*',@FaultNums)+1,len(@FaultNums)-charindex('*',@FaultNums))
declare @sqls nvarchar(300)
set @sqls='select @a=病历描述 from ' + @Kind+'病历表 where 病历编号='+@FaultNum
exec sp_executesql @sqls,N'@a nvarchar(1000) output',@Discription output
set @Discriptions=@Discriptions+isnull(@Discription,'')
if (@FaultNum<>@FaultNums) goto j1
end
return @Discriptions
end

关键代码还是这一块:
set @sqls='select @a=病历描述 from ' + @Kind+'病历表 where 病历编号='+@FaultNum
exec sp_executesql @sqls,N'@a nvarchar(1000) output',@Discription output

因为种类名是不定的,所以想采用动态SQL来执行,像上面一样取得最终的结果。

但是问题就出来了,在函数创建成功后并执行时,提示:

消息 557,级别 16,状态 2,第 1 行
只有函数和扩展存储过程才能从函数内部执行。


这个问题该怎么处理?或者通过什么方法可以达到我想要的想过?

高手给解答下。
...全文
93 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
把*换成in来处理,不简单多了吗?
人鱼传说 2010-08-08
  • 打赏
  • 举报
回复
首先一点可以肯定,函数内是执行不了动态SQL的(期待以后可以),看你的需求是否是传入多个病历号,然后取出它们的病历描述呢?如果是这样,那你可以在存储过程中将@FaultNums的*替换成逗号,如
set @sql='select 病历描述 from ' + @Kind+'病历表 where 病历编号 in ('+replace(@FaultNums,'*',',')+')'
--将数据集插入表变量
declare @BLDesc table(BL nvarchar(1000) null)
insert into @BLDesc Exec @sql
--将病历描述存到@Discriptions
set @Discriptions=N''
select @Discriptions=@Discriptions+Isnull(BL,N'')+N',' from @BLDesc
set @Discriptions=left(@Discriptions,len(@Discriptions)-1)
return @Discriptions
duanzhi1984 2010-08-07
  • 打赏
  • 举报
回复
想想其他办法吧,比如过程之类的。。。也许也是可以的。

过程最起码支持动态语句的
liwenguang_2009 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xys_777 的回复:]
函数里不能执行动态sql,没什么办法
[/Quote]


我该如何实现我想要的效果呢?除了用大量的
if
……
else
……
以外。
永生天地 2010-08-07
  • 打赏
  • 举报
回复
函数里不能执行动态sql,没什么办法
liwenguang_2009 2010-08-07
  • 打赏
  • 举报
回复
好,下面我想将这段代码封装成一个函数,用来实现根据参数获取结果:

函数如下:
create function [dbo].[GetFaultDiscription](@FaultNums nvarchar(1000),@Kind nvarchar(50))
returns nvarchar(max)
as
begin
declare @Discription nvarchar(1000)
declare @FaultNum nvarchar(10)
declare @Discriptions nvarchar(max)
set @Discriptions=''
if @FaultNums is not null
begin
j1:
set @FaultNum=case when charindex('*',@FaultNums)>0 then substring(@FaultNums,1,charindex('*',@FaultNums)-1)
else @FaultNums
end
set @FaultNums=substring(@FaultNums,charindex('*',@FaultNums)+1,len(@FaultNums)-charindex('*',@FaultNums))
declare @sqls nvarchar(300)
set @sqls='select @a=病历描述 from ' + @Kind+'病历表 where 病历编号='+@FaultNum
exec sp_executesql @sqls,N'@a nvarchar(1000) output',@Discription output
set @Discriptions=@Discriptions+isnull(@Discription,'')
if (@FaultNum<>@FaultNums) goto j1
end
return @Discriptions
end


关键代码还是这一块:
set @sqls='select @a=病历描述 from ' + @Kind+'病历表 where 病历编号='+@FaultNum
exec sp_executesql @sqls,N'@a nvarchar(1000) output',@Discription output

因为种类名是不定的,所以想采用动态SQL来执行,像上面一样取得最终的结果。

但是问题就出来了,在函数创建成功后并执行时,提示:
SQL code
消息 557,级别 16,状态 2,第 1 行
只有函数和扩展存储过程才能从函数内部执行。


这个问题该怎么处理?或者通过什么方法可以达到我想要的想过?

高手给解答下。

因为种类名是不定的,相应的表都已经存在。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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