2017-05-17 6 views
3

私はテーブルの入札の最高価格をテーブルのオブジェクトに自動的に挿入するトリガーを探しています。 0から1に変わります。SQLでのトリガーの問題

私はObjectNumber、endprice(null)、closed?(bit)(nullでない、デフォルト0)の値を持つテーブルObjectを取得しています。

値(Objectnumber、ユーロ(プリヴェ入札の)、ユーザ名)を持つテーブルの入札は

これは私が現在得たもので、

CREATE TRIGGER AF5 ON objects 
FOR INSERT, UPDATE 
AS 
BEGIN 
DECLARE @objectnumber numeric(10) 
DECLARE @endprice  numeric(7,2) 
DECLARE @closed?  bit 
SET @objectnumber = (SELECT objectnumber from inserted) 
SET @endprice =(SELECT endprice from inserted) 
SET @closed? =(SELECT closed? from inserted) 
IF EXISTS  (  
        SELECT subjectnumber 
        FROM inserted 
        WHERE closed? = 1 AND endprice = NULL   
     ) 
BEGIN 
    PRINT ('Found') 
      update objects set endprice = ( 
        SELECT MAX(b.euro) 
        from bids b INNER JOIN objects v 
        on @objectnumber = b.objectnumber 
        where @closed? = 1 
      ) 
     END 
    ELSE 
     BEGIN 
      RAISERROR ('Error', 1, 1) 
      ROLLBACK 
     END 
    END 
    GO 

私は入れませんエラーが メッセージ512であります、レベル16、状態1、プロシージャAF5、行8 [バッチ開始行3834] サブクエリが2つ以上の値を返しました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

+0

@@ROWCOUNT変数をチェックし、問題は何ですか? –

+0

サブクエリが2つ以上の値を返しました。サブクエリが=、!=、<, <= , >、> =、またはサブクエリが式として使用されているときは、これは許可されません。 – Josh

+1

エラーが発生すると、サブクエリの1つが2つ以上の値を返していますが、これは許可されていません。サブクエリを別々に実行し、複数の値を返すかどうかを確認し、サブクエリを更新して1つの値のみを返すようにします(つまり、複数の値が返される必要がある場合はサブクエリがないようにコードを再構成します)。挿入されたデータと一致する入札単価表には、おそらく複数のobjectnumber値があります。 –

答えて

1

insertedテーブルには複数の行が含まれることがあります。

IFトリガーを再起動することができますので、後で更新することができますので、条件を削除します。あなたがしたい場合は、insertedテーブルで更新された行の数を取得し、行数と比較する

CREATE TRIGGER AF5 ON objects 
FOR INSERT, UPDATE 
AS 
BEGIN 
    IF @@ROWCOUNT = 0 RETURN 

    UPDATE O 
    SET endprice = B.EndPrice 
    FROM Objects  O 
    INNER JOIN inserted I on O.objectnumber = I.objectnumber 
    CROSS APPLY (
     SELECT EndPrice = MAX(B.euro) 
     FROM bids B 
     WHERE B.objectnumber = O.objectnumber 
    ) B 
    WHERE I.[Closed?] = 1 AND I.endprice IS NULL AND B.EndPrice IS NOT NULL 
END 
+0

これにより、ストアドプロシージャ、関数、トリガ、またはビューのネストレベルの最大値を超えた(制限32)ネストエラーが発生します。 – Josh

+0

私の答えを編集しました –

+0

奇妙な私はまだ同じ "メッセージ217、レベル16、状態1、プロシージャAF5、行6 [バッチ開始ライン3859]を取得しています ストアドプロシージャ、ファンクション、トリガ、またはビューのネストレベルの最大(制限32)を超えました。 1つのオブジェクトまたは複数のオブジェクトを挿入/更新しようとすると問題はありません。 – Josh