2014-08-27 68 views
0

我[ReconcileUserInformationComputed]上Userinformation表SQL Server 2008 ::子查詢返回多個值。這不是當子查詢跟隨允許=,!=,<, <= , >,> =

Userinformation表具有下面的行 [ID]觸發,[CompanyID],[狀態], [名字],[姓氏]

UserinformationComputed表有以下行 [ID],[CompanyID],[law_id],[狀態],[名字],[姓氏]

下面是我的觸發

USE [einvoice] 
GO 
/****** Object: Trigger [dbo].[ReconcileUserInformationComputed] Script Date: 08/27/2014 10:53:08 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 



ALTER TRIGGER [dbo].[ReconcileUserInformationComputed] ON [dbo].[UserInformation] AFTER INSERT,DELETE,UPDATE 
AS 
    IF @@ROWCOUNT = 0 -- exit trigger when zero records affected 
    BEGIN 
     RETURN 
    END 
    SET NOCOUNT ON; 
    IF EXISTS (SELECT * FROM INSERTED) 
    BEGIN 
     IF EXISTS (SELECT * FROM DELETED) 
     BEGIN 
      --UPDATE 
       UPDATE [dbo].[UserInformationComputed] 
       SET -- use new values from inserted 
       CompanyID = (SELECT CompanyID from inserted), 
       law_id = (SELECT ID FROM inserted), 
       Status = (SELECT Status FROM inserted), 
       FirstName = (SELECT FirstName FROM inserted), 
       LastName = (SELECT LastName FROM inserted), 
    WHERE -- use original values from deleted 
       law_id = (SELECT ID FROM deleted) 
    END 
    ELSE 
    BEGIN 
     --INSERT 
     INSERT INTO [dbo].[UserInformationComputed] (CompanyID,law_id,Status,FirstName,LastName) 
    SELECT CompanyID,id,Status,FirstName,LastName) FROM inserted 
    END 
END 
ELSE IF EXISTS(SELECT * FROM DELETED) 
BEGIN 
    --DELETE 
    DELETE FROM [dbo].[UserInformationComputed] 
    WHERE law_id = (SELECT id FROM deleted) 
END 

時嘗試更新Userinformation多個用戶正在以下錯誤越來越

Msg 512, Level 16, State 1, Procedure ReconcileUserInformationComputed, Line 16 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

我所做的更改按照它的工作對上述觸發,但同樣的更改沒有工作的另一個觸發

ALTER TRIGGER [dbo].[ReconcileCrossRefComputed] ON [dbo].[CrossRef] AFTER INSERT, UPDATE, DELETE 
AS 
    IF @@ROWCOUNT = 0 -- exit trigger when zero records affected 
    BEGIN 
     RETURN 
    END 
    SET NOCOUNT ON; 
    IF EXISTS (SELECT * FROM INSERTED) 
    BEGIN 
     IF EXISTS (SELECT * FROM DELETED) 
     BEGIN 
      --UPDATE 
      UPDATE [dbo].[CrossRefComputed] 
      SET -- use new values from inserted 
      SenderId = inserted.SenderId, 
      ReceiverId = inserted.ReceiverId, 
      ForeignRef = inserted.ForeignRef, 
      PolicyID = inserted.PolicyID, 
     From inserted 
     WHERE -- use original values from deleted 
     [CrossRefComputed].SenderId = inserted.SenderId 
     AND [CrossRefComputed].ReceiverId = inserted.ReceiverId 
    END 
    ELSE 
    BEGIN 
     --INSERT 
     INSERT INTO [dbo].[CrossRefComputed] (SenderId, ReceiverId, ForeignRef, PolicyID) 
     SELECT SenderId, ReceiverId, Effective, PolicyID FROM inserted 
    END 
END 
ELSE IF EXISTS(SELECT * FROM DELETED) 
BEGIN 
    --DELETE 
    DELETE FROM [dbo].[CrossRefComputed] 
    WHERE SenderId in (SELECT SenderId FROM deleted) 
    AND ReceiverId in (SELECT ReceiverId FROM deleted) 
END 
答案

任何人請幫助我如何修復程序來處理更新多個記錄?

+2

不使用'='用於多結果子查詢。改用'IN'(...)'。 – 2014-08-27 16:42:31

+0

像CompanyID(從插入的SELECT公司ID)? – RanPaul 2014-08-27 16:43:21

+0

你在(值列表)如此接近......值爲1 = 1倍的值或者1的值了,從來沒有1個值=價值 – Twelfth 2014-08-27 16:47:08

回答

2

要知道,一個UPDATE或DELETE可以影響一個以上的記錄,您的觸發將有一次對付他們,在這種情況下,你的「插入」或「刪除」表將有一個以上的記錄。

你將不得不使用你的DML聯接。像這樣的:

UPDATE [dbo].[UserInformationComputed] 
       SET 
       CompanyID = inserted.CompanyID, 
       law_id = inserted.ID, 
       Status = inserted.Status, 
       FirstName = inserted.FirstName, 
       LastName = inserted.LastName 
      from inserted 
    WHERE 
       UserInformationComputed.law_id = inserted.ID 

我還沒有完全理解你的更新邏輯,所以你將不得不適應我的代碼。

在你的DELETE命令,你可能剛剛改變 「=」 到 「中」:

DELETE FROM [dbo].[UserInformationComputed] 
    WHERE law_id in (SELECT id FROM deleted) 

看看這個:

http://msdn.microsoft.com/en-us/library/ms190752.aspx

+0

#Caffe我所做的更改爲u建議UserInformationComputed觸發它的工作,但它不是爲triiger ReconcileCrossRefComputed工作(更新我的答案) – RanPaul 2014-08-28 14:31:57

+0

@RanPaul你得到了什麼錯誤? – 2014-08-28 14:33:44

+0

子查詢返回的值超過1。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。 – RanPaul 2014-08-28 14:40:55

相關問題