难道这是真的吗?“MS SQLServer中Function不能对实际表使用insert,update等语句”

jornk 2004-12-09 06:43:55
以下function编译没有通过:
CREATE FUNCTION testfunc()
RETURNS char(1) AS
BEGIN
update table1 set name='a' where id =1
return('0')
END

而以下procedure是可以的:
CREATE PROCEDURE testProc AS
update table1 set name='a' where id =1

而以下function也是可以的:
CREATE FUNCTION testfunc2()
RETURNS char(1) AS
BEGIN
exec testProc
return('0')
END

============================================
刚才几位高手告诉我“MS SQLServer中Function不能使用insert,update等语句”
但我是在不明白为什么MS SQLServer不允许在Function中对实际表使用insert,update语句。
...全文
462 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jornk 2004-12-16
  • 打赏
  • 举报
回复
没人回罗,收贴!
hai2003xp 2004-12-15
  • 打赏
  • 举报
回复
學習,收藏.......
zjcxc 2004-12-10
  • 打赏
  • 举报
回复
我想微软这样做也是有道理的,比如,你写这样一个函数:

create function f_sum() returns int
as
begin
insert tb values(1)
return(select count(*) tb)
end
go

--然后再调用
select dbo.f_sum() from tb

这样就是出大乱子了么?
zjcxc 2004-12-10
  • 打赏
  • 举报
回复
确实如此,这是SQL的限制,联机帮助上写得很清楚了


未在下面的列表中列出的语句不能用在函数主体中。

赋值语句。


控制流语句。


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


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


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


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


EXECUTE 语句调用扩展存储过程。
cqdj 2004-12-10
  • 打赏
  • 举报
回复
存储过程的功能比函数要强很多,建议在对数据库作改变操作的时候,最好使用存储过程.
TYEROU 2004-12-10
  • 打赏
  • 举报
回复
1G的rm! free!


www.8cd.cn
jornk 2004-12-10
  • 打赏
  • 举报
回复
<我是楼主>
谢谢各位为我解答,使用MS SQLServer时间不长,联机帮助也没有好好看过,所以很多东西都不太懂。

to: zjcxc(邹建)
我认为你那个dbo.f_sum()中包含了insert语句问题也不是很大,我想这个应该是“脏数据”,在同一个事务中数据是可以被访问使用的,所以f_sum值是"原count"+1。
而且Oracle中就允许这用使用。


随便再请教大家:
1. SqlServer 的Procedure,Function中能不能象Oracle一样有子Procedure/Function ?
2. 有没有Package的概念? (总觉得我的Procedure/Function多了就乱七八糟)
3. 有没有Oracle中的Sequence?

SqlServer中很多东西还是很方便啊,返回数据集、临时表等等。
需要多多向各位学习! 谢谢


vinsonshen 2004-12-09
  • 打赏
  • 举报
回复
存储过程里可以进行这一系列的操作~~
ashhyc 2004-12-09
  • 打赏
  • 举报
回复
这个就是函数与存储过程的区别,可以通过storeproduce写update
vinsonshen 2004-12-09
  • 打赏
  • 举报
回复
在函数中对实际表进行update操作是不行的~~~
对表变量就可以~~~
Andy__Huang 2004-12-09
  • 打赏
  • 举报
回复
//但我是在不明白为什么MS SQLServer不允许在Function中对实际表使用insert,update语句。

這是因為韋返了ms規定的原則,它不允許這樣用
Frewin 2004-12-09
  • 打赏
  • 举报
回复
insert 可以
Andy__Huang 2004-12-09
  • 打赏
  • 举报
回复
用insert into 可以,不能用update語句
guanshiyu123 2004-12-09
  • 打赏
  • 举报
回复
没有通用性
chd2001 2004-12-09
  • 打赏
  • 举报
回复
低手顶

27,579

社区成员

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

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