期待对话错误Sql Server

时间:2016-06-29 16:49:36

标签: sql

我正在尝试在SQL Server 2008 R2中创建一个触发器以用于审计目的。为了获得全国不同位置的正确时区,我试图将变量传递给IF / ELSE IF语句,以使用DATEADD()函数更改小时数。这是我的代码:

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

我得到了各种各样的错误,所有这些错误都说明了对话。我不确定这意味着什么。我用谷歌搜索它,这只是增加了混乱。

1 个答案:

答案 0 :(得分:0)

首先,在编写触发器时,您必须考虑一次插入,更新或删除多条记录!

我假设sql server正在查看你的代码,但是如果有不同的rdbms请注意它。

下一步

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

总是会给你epic_cover中已经不是你想要的设施代码。

然后,您尝试将IF语句与不允许的更新语句混合使用。但实际情况是你没有任何if,你只能使用案例陈述。

然后,您将更新表中的所有记录,而不仅仅是已插入的记录。如果你没有一个或一个方法来确定添加了哪些记录,你将需要一个主键!然后使用特殊的"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