SQL Server 2000中触发器提示错误(100分)

  • 主题发起人 主题发起人 wellknow
  • 开始时间 开始时间
W

wellknow

Unregistered / Unconfirmed
GUEST, unregistred user!
--下面是我的一个更新总库存数量的触发器
--在期初库存明细 StoresBalD 商品库存数量 Qty 改变时改变库存表 Onhand
CREATE TRIGGER [StoresBalD2Onhand] ON [StoresBalD]
FOR INSERT, UPDATE, Delete
AS
SET NOCOUNT ON

/*
***********************Onhand表结构***********************
StoresID:Integer
GoodsID:Varchar
Onhand:Float
*/

select Id, ItemNo, GoodsID, fldUpdateQty=sum(Quantity)
into #tmpUpdate__
from
(select Id, ItemNo, GoodsID, Quantity from Inserted
Union all
select Id, ItemNo, GoodsID, -Quantity from Deleted
)as tblUpdate__
Group by
Id, ItemNo, GoodsID

UPDATE Onhand
SET Onhand = oh. Onhand + tm.fldUpdateQty
from #tmpUpdate__ tm right Join Onhand oh
on oh. StoresID = -tm. id

INSERT INTO Onhand
select -Id, GoodsID, fldUpdateQty
from #tmpUpdate__
where -id not in
(select storesID from Onhand )

--drop table #tmpUpdate__

难道在SQL Server 2000中不能用Select ... INTO ... 吗?
 
应该不能用吧
 
能用,是不是这的问题
UPDATE Onhand
SET Onhand = oh. Onhand + ISNULL(tm.fldUpdateQty,0)
from #tmpUpdate__ tm right Join Onhand oh
on oh. StoresID = -tm. id
 
不是的,是这里出错:(select Id, ItemNo, GoodsID, Quantity from Inserted
Union all
select Id, ItemNo, GoodsID, -Quantity from Deleted
)
提示说:子查询值插入不能多于一个值!借问各位大师是如何用触发器
来实现进销时总库存数量的增减的?可否提供类似的触发器供参考?!
 
select Id, ItemNo, GoodsID, sum(Quantity) AS fldUpdateQty
into #tmpUpdate__
from
(select Id, ItemNo, GoodsID, Quantity from Inserted
Union all
select Id, ItemNo, GoodsID, -Quantity from Deleted
)as tblUpdate__
Group by
Id, ItemNo, GoodsID

我是用游标,虽然帮助里说:
说明 由于存在对性能的潜在负面影响,不推荐在触发器中使用游标。
使用基于行集的逻辑而非游标来设计影响多行的触发器。


 
是不是在sp_dboption中关于insert into的开关没设置为true啊.
select into/bulkcopy When true, the SELECT INTO statement and fast bulk copies are allowed.
 
to bluerain:
我应该如何修改sp_dboption中关于insert into的开关设置呀?
 
--谢谢BlueRain,PCLover,Ugvanxk,这个问题我搞定了.如下:

CREATE TRIGGER [StockReceiveD2Onhand] ON dbo.StockReceiveD
FOR INSERT, UPDATE, DELETE
AS
/*单据明细表 主要的结构*/
/*
ID
ItemNo
StoreID
GoodsID
Quanity
*/
/*Onhand 的表结构*/
/*
StoreID
GoodsID
Quantity
*/

DECLARE @ID INT, @ItemNo SMALLINT, @StoreID SMALLINT, @GoodsID VARCHAR(50), @Quantity FLOAT

BEGIN TRAN

--保存最新的单据的数量明细到一个游标中
DECLARE D2Onhand CURSOR FOR SELECT StoreID, GoodsID, SUM(Quantity) AS Qty FROM
(SELECT ID, ItemNo, StoreID, GoodsID, Quantity FROM Inserted
UNION all
SELECT ID, ItemNo, StoreID, GoodsID, -Quantity FROM Deleted
) AS UpdateTbl
GROUP BY ID, ItemNo, StoreID, GoodsID
OPEN D2Onhand
--打开游标后分别取得 仓库号, 商品编号和数量
FETCH NEXT FROM D2Onhand INTO @StoreID, @GoodsID, @Quantity
WHILE @@FETCH_STATUS = 0
BEGIN
--在总库存表中查找指定仓库的该商品编号
--如果有,则更新数量
--如果没,则插入数量
IF EXISTS(SELECT GoodsID FROM Onhand WHERE (StoreID = @StoreID) AND (GoodsID = @GoodsID))
BEGIN
UPDATE Onhand SET Quantity = Quantity + @Quantity WHERE (StoreID = @StoreID) AND (GoodsID = @GoodsID)
END
ELSE
BEGIN
INSERT Onhand VALUES (@StoreID, @GoodsID, @Quantity)
END
--完成总库存数量的更新/插入

FETCH NEXT FROM D2Onhand INTO @StoreID, @GoodsID, @Quantity
END--WHILE @@FETCH_STATUS = 0
CLOSE D2Onhand
DEALLOCATE D2Onhand

COMMIT
 
跟我以前写的一样,不过我看了你的帖子后,
我把游标换成表变量了,表变量在内存中使用,自动释放,语句也少。
CREATE TRIGGER [ALL_M_WO] ON [dbo].[M_WO]
FOR INSERT, UPDATE, DELETE
AS

DECLARE @tUpdate TABLE (RKEY INTEGER, QTY_SCH NUMERIC(14,4) DEFAULT 0)

SET NOCOUNT ON

INSERT INTO @tUpdate
SELECT SOURCE_PTR, SUM(QTY_SCH) FROM
(SELECT SOURCE_PTR, QTY_SCH FROM INSERTED UNION ALL
SELECT SOURCE_PTR, -QTY_SCH FROM DELETED ) INS_DET
GROUP BY SOURCE_PTR

UPDATE D_SO SET QTY_PLANNED=QTY_PLANNED+QTY_SCH
FROM @tUpdate T WHERE T.RKEY = D_SO.RKEY


 
to Pclover,
我用过你的方法,可是,不知道为什么,我的触发器在子查询处提示错误:子查询值多于一个.

希望以后能多多向你学习.
 
互相学习。
我觉得你的fldUpdateQty=sum(Quantity)可能有问题,
系统在编译时会当做变量而不是别名,因此要求子查询只能返回一
条记录。改为AS还不行的话,把你的表结构和触发器语句一起贴出来看吧。
 
但这种情况在7.5下没问题呀.
 
SQL Server 7.5? 没用过,6.5用过但忘了具体语法,请查相关文挡。
MS得东东推荐一个网站 http://search.support.microsoft.com/kb/c.asp?ln=en
 
后退
顶部