2012-01-03 122 views
0

Message已經有觸發器。該觸發器內成功運行我有一個insert聲明:Sql Server 2008觸發器

Insert into tblSettlement (MessageID,Lat,Long) Select Messageid,y,x from inserted 

桌上tblSettlement我已經把該觸發器:

ALTER TRIGGER [dbo].[AddSettlementOnINSERT] 
ON [dbo].[TblSettlement] 
After INSERT 
    AS 
DECLARE @id Bigint, @Lat Float,@Long Float, @LocName Varchar(200), @Dist float,@upd bit 
Set @upd = (SELECT updated FROM inserted) 
SET @id = (SELECT MessageID FROM inserted) 
SET @lat = (SELECT [Lat] FROM inserted) 
SET @Long = (SELECT [Long] FROM inserted) 
if (@upd = 0) 
begin 
declare @table table 
(Location Varchar(200),Distance float) 
insert into @table 
SELECT top 1 Full_Name_nd, SQRT(
    POWer(69.1 * (lat - @lat), 2) + 
    POWer(69.1 * (@long - long) * COS(lat/57.3), 2))As distance 
FROM geodb.dbo.geonames where SQRT(
    POWer(69.1 * (lat - @Lat), 2) + 
    POWer(69.1 * (@Long - long) * COS(lat/57.3), 2)) < 1 
set @LocName = (select location from @table) 
set @Dist = (select distance from @table) 
Insert into dbo.tblset2 

(Messageid,lat,long,settlement,distance)values(@id,@lat,@long,@locName,@Dist) 
    end 

然而問題是,每當我們使上述觸發,插入停止工作Message表。

含義:我們希望插入後插入少量列值並嘗試使用同一個表格的觸發器更新另一個表格。這實際上不允許我們插入。

+0

你可以單獨運行'SELECT'查詢並驗證結果嗎?本條款 - 'SQRT(POWer(69.1 *(lat - @ Laat),2)+ POWer(69.1 *(@ Long - long)* COS(lat/57.3),2))<1'對我來說看起來很可疑。 – Yuck 2012-01-03 13:59:53

+0

究竟發生了什麼?是否有錯誤訊息? 「插入停止工作....不允許我們插入」中包含的信息不足以幫助診斷。 **您是否在adhoc環境中運行觸發器的TSQL來調試哪些部件可能會給您帶來麻煩?** – 2012-01-03 14:01:27

+0

感謝您的回覆。是的,我已經隔離運行代碼,它的工作原理....但問題是,當我們使啓用在消息表中的觸發器記錄插入被停止:(:(正在由後端服務管理) – 2012-01-03 14:09:59

回答

5

您對SQL Server觸發器的基本假設是錯誤的 - 您似乎假設(儘可能多的人)觸發器將被插入每行一次 - 即不是的情況!

觸發器將被稱爲每條語句一次 - 也就是說,如果你的語句插入一次20行,你的觸發器將被稱爲一次,和僞表Inserted將包含20排在它

因此,如果Inserted包含多個行,在這裏你的發言要麼慘遭失敗,或者選擇任意的,隨機的條目:

DECLARE @id Bigint, @Lat Float,@Long Float, @LocName Varchar(200), @Dist float,@upd bit 
Set @upd = (SELECT updated FROM inserted) 
SET @id = (SELECT MessageID FROM inserted) 
SET @lat = (SELECT [Lat] FROM inserted) 
SET @Long = (SELECT [Long] FROM inserted) 

你必須完全重寫你的觸發,考慮到Inserted能並將包含多行

+2

在插入或刪除字段中設置標量變量肯定表示觸發器寫入不正確 – HLGEM 2012-01-03 15:51:26

+1

「選擇一個隨機的隨機條目」 - 不,它比那更有趣 - 因爲有4個獨立的選擇,我們可以從每個插入行的任意*行中獲得一個隨機元素 - 不能保證4選定的值將被關聯。 – 2012-01-03 19:48:26

+0

@Damien_The_Unbeliever:是的,這就是我的意思 - 你應該更清楚地說 - 謝謝!無論哪種方式選擇這些值 - 這個觸發器都不起作用,不會做它應該做的事情...... – 2012-01-03 19:56:03