繁体   English   中英

SQL Server TRIGGER IF值存在,然后将其更改为其他

[英]SQL Server TRIGGER IF Value Exist then Change it to Something else

我有一个名为dbo.PBXDATA的表。 我想设置一个触发器,如果​​SALES_REP列的值等于特定值(int),然后将该值更改为Table列中sales_rep的名称。 以下是到目前为止的内容。 任何提示都会很棒。 谢谢。

CREATE TRIGGER dbo.PBXDATA_trgIUD_sales_rep
   ON  dbo.PBXDATA
   AFTER INSERT,UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
SELECT CAST(WHEN SALES_REP = '101'
THEN 'Ryan Kosterow'
ELSE 'NULL'
END as NVARCHAR) FROM dbo.PBXDATA

SELECT CAST(WHEN SALES_REP = '115'
THEN 'Robert Messing'
ELSE 'NULL'
END as NVARCHAR) FROM dbo.PBXDATA

SELECT CAST(WHEN SALES_REP = '114'
THEN 'Paul Clark'
ELSE 'NULL'
END as NVARCHAR) FROM dbo.PBXDATA

SELECT CAST(WHEN SALES_REP = '110'
THEN 'Aaron Townsley'
ELSE 'NULL'
END as NVARCHAR) FROM dbo.PBXDATA

END
GO

我认为您打算执行UPDATE操作而不是SELECT 同样,您实际上正在尝试使用CASE表达式,并且当前的语法CAST(WHEN SALES_REP = '101' ...是错误的。您可以尝试如下操作:

UPDATE dbo.PBXDATA SET SALES_REP = CASE WHEN SALES_REP = '101' THEN 'Ryan Kosterow'
WHEN SALES_REP = '115' THEN 'Robert Messing' 
WHEN SALES_REP = '114' THEN 'Paul Clark'
WHEN SALES_REP = '110' THEN 'Aaron Townsley'
ELSE 'NULL' END

您可以使用inserted的特殊表来执行更新。 该表将在触发器中可用,并将包含要更新的行。 这可能是代码:

update inserted 
set SALES_REP = 'Ryan Kosterow'
where SALES_REP = '101'

update inserted 
set SALES_REP = 'Robert Messing'
where SALES_REP = '115'

update inserted 
set SALES_REP = 'Paul Clerk'
where SALES_REP = '114'

update inserted 
set SALES_REP = 'Aaron Townsley'
where SALES_REP = '110'

这是一个糟糕的设计。 您确实应该有一个SALES_REP_NAMES表,当您需要一个输出名称的查询时,可以将其加入PBXDATA表。 看起来像

SALES_REP_ID    NAME
------------    ----------------
110             Aaron Townsley
etc...

比您可以做的事情:

SELECT
  *
FROM
  PBXDATA P
  JOIN SALES_REP_NAMES N
    ON P.SALES_REP = N.SALES_REP_ID

但是,如果您真的想通过TRIGGER进行操作,它应该如下所示。 请注意,它通过检查TRIGGER是否需要执行UPDATE来避免递归嵌套。

CREATE TRIGGER dbo.PBXDATA_trgIUD_sales_rep ON dbo.PBXDATA
  AFTER INSERT, UPDATE
AS
  BEGIN
    SET NOCOUNT ON;
    IF UPDATE(SALES_REP) 
      UPDATE
        p
      SET
        p.SALES_REP = CASE WHEN SALES_REP = '101' THEN 'Ryan Kosterow'
                         WHEN SALES_REP = '115' THEN 'Robert Messing'
                         WHEN SALES_REP = '114' THEN 'Paul Clark'
                         WHEN SALES_REP = '110' THEN 'Aaron Townsley'
                    END
      FROM
        INSERTED I
        JOIN PBXDATA P
          ON I.SALES_REP = P.SALES_REP
      WHERE
        I.SALES_REP IN ( '101', '115', '114', '110' )

  END 
GO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM