1. ホーム
  2. sql

[解決済み] 期待する会話エラー Sql Server

2022-02-14 03:06:30

質問

SQL Server 2008 R2 で、監査用のトリガーを作成しようとしています。全国の異なる場所の適切なタイムゾーンを取得するために、DATEADD()関数を使用して時間を変更するIF/ELSE IFステートメントに変数を渡そうとしているのです。以下は私のコードです。

CREATE TRIGGER epic_cover_insert
ON epic_cover
AFTER INSERT
AS 
BEGIN
DECLARE @facilityCode INT

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover)
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for trigger here
UPDATE epic_cover
IF @facilityCode = 403  --for logan
    BEGIN
        SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME()
                           WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
                           ELSE Created_By END,
            Created_On = DATEADD(HH,-1,GETDATE()
    END
    ELSE IF @facilityCode = 203   -- for Thermont
        BEGIN
            SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME()
                           WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
                           ELSE Created_By END,
                Created_On = DATEADD(HH,1,GETDATE())
        END
    ELSE IF @facilityCode = 263 --for Saint Charles
        BEGIN
            SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME()
                           WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
                           ELSE Created_By END,
                Created_On = GETDATE()
        END
END
END

EXPECTING CONVERSATIONと書かれた様々なエラーが出ますが、これは何ですか?これが何を意味するのかよくわかりません。ググってみたけど、さらに混乱が深まったよ。

解決するには?

まず、トリガーを書くときに、一度に1つ以上のレコードが挿入、更新、または削除されることを考える必要があります。

あなたのコードを見て、私はsql serverを想定していますが、もし違うrdbmsであれば、そのことに留意してください。

次のページ

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover)

は常に、epic_cover にすでにあるファシリティコードを与えようとしており、それはあなたが望むものではありません。

それから、あなたはIF文とupdate文を混ぜようとしていますが、これは許されません。 しかし、実際には、IF文は使用せず、case文を使用すればよいのです。

それから、挿入されたレコードだけでなく、テーブル内のすべてのレコードを更新することになります。 テーブルの主キーがない場合、あるいはどのレコードが追加されたかを知るための方法が必要です。次に、特別な "inserted" テーブルを使用します。

CREATE TRIGGER epic_cover_insert
ON epic_cover
AFTER INSERT
AS 
BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for trigger here
UPDATE epic_cover
    SET Created_By = CASE WHEN i.Created_By IS NULL THEN SUSER_NAME()
                    WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME()
                    ELSE i.Created_By END
       ,Created_On = CASE
       -- right function is for strings so I assume order num is a string if not you will need to do some casting
          WHEN RIGHT(i.order_num, 3) = '403' THEN DATEADD(HH,-1,GETDATE())
          WHEN RIGHT(i.order_num, 3) = '203' THEN DATEADD(HH,1,GETDATE())
          WHEN RIGHT(i.order_num, 3) = '263' THEN GETDATE()
          ELSE NULL-- ?????
       END
FROM
    epic_cover e
    INNER JOIN inserted i
    ON e.PrimaryKey = i.PrimaryKey

END