[英]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.