函数中带有insert into语句报错,请问为什么?

懒得优化能跑就行 2005-12-29 12:32:28
我是SQL 2000的新手,当我编写一个函数时,函数包含了一个insert into语句,执行报错。
报错内容:
服务器: 消息 156,级别 15,状态 1,过程 RepairReport,行 24
在关键字 'INSERT' 附近有语法错误。
程序内容:
--维修报告
CREATE FUNCTION RepairReport (
@dep_id INT, --部门编号
@equipment_type INT, --设备名称编号
@report_time DATETIME, --报修时间
@inter_id CHAR(10), --内部编号
@breakdown_des NVARCHAR(30) --故障描述
)
RETURNS INT
BEGIN
DECLARE @result int
if(SELECT inter_id FROM T_REPAIR_REPORT)=@inter_id
begin
set @result=1
end
ELSE
BEGIN
INSERT INTO T_REPAIR_REPORT(department_id,equipment_type,inter_id,breakdown_des) VALUES (@dep_id,@equipment_type,@inter_id,@breakdown_des)
SET @result=0
END
RETURN @result
END



...全文
273 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
OracleRoob 2005-12-29
  • 打赏
  • 举报
回复
但对于表变量可以使用这些语句,见下例:

CREATE FUNCTION fn_FindReports (@InEmpId nchar(5))
RETURNS @retFindReports TABLE (empid nchar(5) primary key,
empname nvarchar(50) NOT NULL,
mgrid nchar(5),
title nvarchar(30))
AS
BEGIN
DECLARE @RowsAdded int
-- table variable to hold accumulated results
DECLARE @reports TABLE (empid nchar(5) primary key,
empname nvarchar(50) NOT NULL,
mgrid nchar(5),
title nvarchar(30),
processed tinyint default 0)
-- initialize @Reports with direct reports of the given employee
INSERT @reports
SELECT empid, empname, mgrid, title, 0
FROM employees
WHERE empid = @InEmpId
SET @RowsAdded = @@rowcount
-- While new employees were added in the previous iteration
WHILE @RowsAdded > 0
BEGIN
/*Mark all employee records whose direct reports are going to be
found in this iteration with processed=1.*/
UPDATE @reports
SET processed = 1
WHERE processed = 0
-- Insert employees who report to employees marked 1.
INSERT @reports
SELECT e.empid, e.empname, e.mgrid, e.title, 0
FROM employees e, @reports r
WHERE e.mgrid=r.empid and e.mgrid <> e.empid and r.processed = 1
SET @RowsAdded = @@rowcount
/*Mark all employee records whose direct reports have been found
in this iteration.*/
UPDATE @reports
SET processed = 2
WHERE processed = 1
END

-- copy to the result of the function the required columns
INSERT @retFindReports
SELECT empid, empname, mgrid, title
FROM @reports
RETURN
END
zlp321002 2005-12-29
  • 打赏
  • 举报
回复
--用存储过程!
OracleRoob 2005-12-29
  • 打赏
  • 举报
回复
函数内部也不允许使用getdate()等函数
OracleRoob 2005-12-29
  • 打赏
  • 举报
回复
函数内不能使用insert into、Update等操作语句处理临时表或数据库中的表
函数内部也不允许使用临时表
pbsql 2005-12-29
  • 打赏
  • 举报
回复
自定义函数中不能用insert,建议改成存储过程
OracleRoob 2005-12-29
  • 打赏
  • 举报
回复
用存储过程的输入参数作为返回值
lsqkeke 2005-12-29
  • 打赏
  • 举报
回复
强烈建议用存储过程。
楼上写出的就是有返回值的啊 @result
panjinfu80 2005-12-29
  • 打赏
  • 举报
回复
换成存储器吧,直接自制过去就成了。
DreamStrat 2005-12-29
  • 打赏
  • 举报
回复
CREATE Procedure RepairReport
@dep_id INT, --部门编号
@equipment_type INT, --设备名称编号
@report_time DATETIME, --报修时间
@inter_id CHAR(10), --内部编号
@breakdown_des NVARCHAR(30), --故障描述
@result int output
AS
BEGIN
if(SELECT inter_id FROM T_REPAIR_REPORT)=@inter_id
begin
set @result=1
end
ELSE
BEGIN
INSERT INTO T_REPAIR_REPORT(department_id,equipment_type,inter_id,breakdown_des) VALUES (@dep_id,@equipment_type,@inter_id,@breakdown_des)
SET @result=0
END
END


调用:
declare @result int
Exec RepairReport 参数.....,@result output
  • 打赏
  • 举报
回复
使用存储过程,可以有返回值吗?

34,594

社区成员

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

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