SQL Server TRIGGER如果存在值,则将其更改为其他内容

时间:2015-08-03 21:49:42

标签: sql-server database if-statement triggers

我有一张名为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

3 个答案:

答案 0 :(得分:0)

我认为您打算执行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

答案 1 :(得分:-1)

您可以使用特殊的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'

答案 2 :(得分:-1)

这是一个糟糕的设计。你真的应该有一个SALES_REP_NAMES表,当你需要一个输出名称的查询时,你可以加入到PBXDATA表。它看起来像

waitForNextLevel

你可以做的事情比如:

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

但是,如果你真的想通过TRIGGER这样做,它应该如下所示。 请注意,它通过检查TRIGGER是否需要进行更新来避免递归嵌套。

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