SQL高手帮忙看看这个问题!该怎么解决?(200分)

  • 主题发起人 主题发起人 Dephic
  • 开始时间 开始时间
D

Dephic

Unregistered / Unconfirmed
GUEST, unregistred user!
SQLSERVER里想写一个函数,函数的参数想传入一个字段,
然后在函数体对的SELECT语句里用上这个字段,该怎么办呢?
函数如下:问题是在SQLSERVER定义的函数里,不能使用EXEC命令,该怎么办啊?急!
ALTER FUNCTION [dbo].[return_c_field] (@cField varchar(10), @aa int,@bb int)
RETURNS varchar(1000) AS
BEGIN
EXEC('declare my_cursor cursor for select ' + @cField + ' from Temp_SpecialtySchedule where a= '
+ CAST(@aa AS Varchar(2)) + ' and b= ' + CAST(@bb AS VarChar(2)) )
open my_cursor;
declare @result as varchar(200);
select @result=''; --
declare @tmp_c_value as varchar(100);
while(@@fetch_status=0)
begin
select @tmp_c_value='';
fetch next from my_cursor into @tmp_c_value;
select @result=@result+@tmp_c_value;
end
close my_cursor;
deallocate my_cursor;
return @result
END
 
照你的写法,完全可以改成存储过程来实现,只不过你的函数的返回值改为存储过程的一个输出参数
 
w12345678,先谢谢!
因为这个函数要出现在别一个存储过程中的SELECT语句里:
即:
有select a,b,return_c_field(@fieldname,a,b) from table 语句出现!
 
先在存储过程中用EXEC创建一个全局游标,然后在你的函数中用,
或就在存储过程中做就行了。
 
create function
//因为这个函数要出现在别一个存储过程中的SELECT语句里:
你可以先先创建存储过程
return_c_field(@fieldname,@aa,@bb)
在新的存储过程中
exec return_c_field @fieldname,@aa,@bb,@s output
select a,b,@s from table
没试过,提供个思路,也没用过这方面

 
ugvanxk,原先我写的是错的,已经改回来了,是需要这样调用的:
select a,b,return_c_field(@fieldname,a,b) from table
函数所用到的参数就是表table的字段!所以用@s output是不行的!
 
函数中的有效语句类型包括:

DECLARE 语句,该语句可用于定义函数局部的数据变量和游标。


为函数局部对象赋值,如使用 SET 给标量和表局部变量赋值。


游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。不允许使用 FETCH 语句将数据返回到客户端。仅允许使用 FETCH 语句通过 INTO 子句给局部变量赋值。


控制流语句。


SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。


INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。


EXECUTE 语句,该语句调用扩展存储过程。
 
kkyy,哎。。。我真混,又没说清楚!
因为会出现不只一个字段需要用到这个函数的值:
即:
select a,b,return_c_field(@fieldname1,a,b),return_c_field(@fieldname2,a,b),return_c_field(@fieldname3,a,b) from table
 
declare @my_cursor varing output
set @sqlstr='set '+@my_cursor+'=cursor for select'+ + @cField + ' from Temp_SpecialtySchedule where a= '
+ CAST(@aa AS Varchar(2)) + ' and b= ' + CAST(@bb AS VarChar(2)) )
exec(@sqlstr)
open @my_cursor
 
那基本上不用想啦,因为在函数内就不能执行动态sql语句
 
对于存储过程来说,它是个存储了一个编译好SQL语法树。因此它不支持任何对表或字段等
使用动态变量代替,因为它无法通过编译。
而EXEC是唯一可以允许所谓动态变量的语句,因为它并没有做实际内部编译,而只是有个编译
好的EXEC语句以及该语句参数压入到存储过程里的语法树中。
所以说你别指望偷懒,一个参数进去,里面存储过程就自动到不同表或取不同字段。
要么你的存储过程里需要动态变化的SQL都写成一个NVARCHAR,然后EXEC调用
(这种写起来就不好写,也没语法检查了,以后出错难检查)
要么你就老老实实的对进来参数做IF/CASE的处理(这个检查错误好,但过程大了,而且改动
需要记得其他部分同步)
 
还是不行:
ALTER FUNCTION [dbo].[return_c_field] (@cField varchar(10), @aa int,@bb int)
RETURNS varchar(1000) AS
BEGIN
EXEC procCreateCursor @cField = @cField, @aa = @aa, @bb = @bb
OPEN my_cursor

DECLARE @result as varchar(1000)
SELECT @result=''
DECLARE @tmp_c_value as varchar(200)
WHILE(@@fetch_status=0)
BEGIN
SELECT @tmp_c_value=''
fetch next from my_cursor into @tmp_c_value
select @result=@result+@tmp_c_value
END
CLOSE my_cursor
DEALLOCATE my_cursor
RETURN @result
END

在函数里应该可以用EXEC执行程序才对啊,我这个函数可以建立起来,但是执行的时候出错:
服务器: 消息 557,级别 16,状态 2,过程 return_c_field,行 6
只有函数和扩展存储过程才能从函数内部执行。
 
用存储过程吧,小心钻进死胡同.
 
呵呵,在函数内,只能执行一些扩展存储过程exec xp_???? 之类的,而且exec()不让用
动态执行sql语句不现实
 
试试这句话
exec sp_executesql 'SQL语句'
 
to 郭玉梁
exec sp_executesql 'SQL语句' 不能用在函数内,因为它不是扩展存储过程
 
我傍晚开机才看到给我的消息。
我认为你是简单问题复杂化,用储存过程可以解决
上面的弟兄都说了
另外@result 什么意思,你定义了吗?好象和普通function的result不用定义
不同吧,反正这种用法没用过
 
谢谢各位兄弟的关注!虽然问题还没解决,还是很感谢大家!
to w12345678,扩展存储过程是什么定义呢? 是系统定义的存储过程?
to 张剑波,@result是我定义的了!一个变量而已!
 
谢谢各位的关注,200分大家分吧~!
 
后退
顶部