日期:2014-05-17  浏览次数:20683 次

在线等待,关于存储过程、自定义函数方面的问题!
一个表中有3个字段分别是
T1(datetime) | T2(datetime) | A1(numeric)

其中A1字段的值是要用到T1和T2字段的值为参数,通过一个很复杂的存储过程计算得到。
现在T1和T2字段值已经确定,记录大概有100万笔,请问如何批量生成A1字段的值

补充说明:我用过自定义函数,但是提示“只有函数和扩展存储过程才能从函数内部执行”

------解决方案--------------------
SQL code
在下面的列表中列出的语句不能用在函数主体中。   

赋值语句。 
控制流语句。 
DECLARE   语句,该语句定义函数局部的数据变量和游标。 
SELECT   语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。 
游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以   INTO   子句向局部变量赋值的   FETCH   语句;不允许使用将数据返回到客户端的   FETCH   语句。 

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

EXECUTE   语句调用扩展存储过程。  

常规扩展过程   
xp_cmdshell   xp_logininfo   
xp_enumgroups   xp_msver   
xp_findnextmsg   xp_revokelogin   
xp_grantlogin   xp_sprintf   
xp_logevent   xp_sqlmaint   
xp_loginconfig   xp_sscanf

------解决方案--------------------
探讨

如果写一个存储过程,该怎么写
现在我把得到A1的存储过程给你
exec sp_calc 't1值','t2值',@返回的A1值 output

那么如何
update
set a1=@返回的a1值

难道让我用用游标一条条去更新吗?

------解决方案--------------------
探讨
一个表中有3个字段分别是
T1(datetime) | T2(datetime) | A1(numeric)

其中A1字段的值是要用到T1和T2字段的值为参数,通过一个很复杂的存储过程计算得到。
现在T1和T2字段值已经确定,记录大概有100万笔,请问如何批量生成A1字段的值

补充说明:我用过自定义函数,但是提示“只有函数和扩展存储过程才能从函数内部执行”

------解决方案--------------------
探讨
自定义函数是不支持临时表的,这个算法很复杂的

------解决方案--------------------
探讨

如果写一个存储过程,该怎么写
现在我把得到A1的存储过程给你
exec sp_calc 't1值','t2值',@返回的A1值 output

那么如何
update
set a1=@返回的a1值

难道让我用用游标一条条去更新吗?

------解决方案--------------------
探讨

我刚才试着将存储过程转为函数但是得到的提示是函数内不能使用临时表

------解决方案--------------------
探讨

忘记补充了,我用的是mssql2000

------解决方案--------------------
建议你把存储过程转换为函数,然后去调用之更新数据.

例如:函数名dbo.f_setvalue(t1,t2)

update tb set a1 = dbo.f_setvalue(t1,t2)

SQL code

建议你提供详细的资料:
例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。
这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。

------解决方案--------------------
改函数肯定可以改:Sp_calcstrdatediff和Sp_datetimetostr过程写成语句(这两个过程和复杂?猜测就一些列case/convert或日期函数之类),#改为@

问题是不从根本上优化算法,对效率提升没有太大的帮助。

------解决方案--------------------
存储过程调用存储过程
全部单条处理

需要改用集合操作思想,成批操作,你的存储过程多于两个参数,其他参数固定?你的这两个参数是固定的还是来自表数据?
估计改成集合操作的存储过程工作量最小,或者改成单行操作的函数,但是由于原来调用存储过程,估计很难改。这是个技术活也是苦力活。