MSSQL中函数问题?

china_ttw 2004-12-27 04:50:01
create Function WM.F_GetBillCd
( @bill_type_id int,
@make_type_id int)
returns varchar(20)
as
begin
declare @Bill_cd varchar(20)

select @bill_cd = case when @make_type_id = 1
then isnull(zbill_type_assign,'') + '_' + wm.f_fillData(isnull(zmax_cd,0),10)
else '#' + wm.f_fillData(isnull(ztmp_max_cd,0),10) end
from wm.bill_type bt(nolock)
where bt.zbill_type_id = @bill_type_id

if @make_type_id = 1
begin
update wm.bill_type
set zmax_cd = isnull(zmax_cd,0) + 1
where zbill_type_id = @bill_type_id
end
else
begin
update wm.bill_type
set ztmp_max_cd = isnull(ztmp_max_cd,0) + 1
where zbill_type_id = @bill_type_id
end
if @@error <> 0 or @@rowcount <> 1
select @bill_cd ='ERROR'
return(@bill_cd)
end
----------------------------------------------------------------------
服务器: 消息 443,级别 16,状态 2,过程 F_GetBillCd,行 17
在函数内不正确地使用了 'UPDATE'。
服务器: 消息 443,级别 16,状态 1,过程 F_GetBillCd,行 23
在函数内不正确地使用了 'UPDATE'。
===================================================
这是为什么,应该怎么用
...全文
65 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
china_ttw 2004-12-27
  • 打赏
  • 举报
回复
写成存储过程我话我没法在SELECT语句中调用呀!
好麻烦的!
Liroyal 2004-12-27
  • 打赏
  • 举报
回复
所以你的功能通过函数实现不了,写成存储过程吧
:P
Liroyal 2004-12-27
  • 打赏
  • 举报
回复
未在下面的列表中列出的语句不能用在函数主体中(联机丛书):
赋值语句。
控制流语句。
DECLARE 语句,该语句定义函数局部的数据变量和游标。
SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
EXECUTE 语句调用扩展存储过程。
Liroyal 2004-12-27
  • 打赏
  • 举报
回复
函数对这些语句有限制
china_ttw 2004-12-27
  • 打赏
  • 举报
回复
在此过程中,每个单一语句都能正确执行!
从DML或DDL的角度出发在SQL的语法上没有任何异常!
但不知道在函数内部为什么不能这么用?
china_ttw 2004-12-27
  • 打赏
  • 举报
回复
我搞不定,大家也搞不定?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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