简体   繁体   English

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

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

I have a table called dbo.PBXDATA . 我有一个名为dbo.PBXDATA的表。 I want to set a trigger where if the value of column SALES_REP equals a specific value(int), then change that value to the name of the sales_rep in the Table column. 我想设置一个触发器,如果​​SALES_REP列的值等于特定值(int),然后将该值更改为Table列中sales_rep的名称。 Below is what I have so far. 以下是到目前为止的内容。 Any hints would be great. 任何提示都会很棒。 Thank you. 谢谢。

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

I think you meant to perform a UPDATE operation rather SELECT . 我认为您打算执行UPDATE操作而不是SELECT Again, you are actually trying to use CASE expression and your current syntax CAST(WHEN SALES_REP = '101' ... is wrong. You can try like below: 同样,您实际上正在尝试使用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

You can use the special inserted table to perform your updates. 您可以使用inserted的特殊表来执行更新。 This table will be available in the trigger and will contain the row being updated. 该表将在触发器中可用,并将包含要更新的行。 This could be the code: 这可能是代码:

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'

This is a bad design. 这是一个糟糕的设计。 You really should have a SALES_REP_NAMES table which you could JOIN to the PBXDATA table when you need to have a query that outputs names. 您确实应该有一个SALES_REP_NAMES表,当您需要一个输出名称的查询时,可以将其加入PBXDATA表。 It would look like 看起来像

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

Than you could do something like: 比您可以做的事情:

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

However IF you really WANT to do it via a TRIGGER it should look like the following. 但是,如果您真的想通过TRIGGER进行操作,它应该如下所示。 Note that it avoids recursive nesting BY checking IF the TRIGGER needs to do an UPDATE. 请注意,它通过检查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