![](/img/trans.png)
[英]SQL Server query to return 1 if value exist in a column else return 0
[英]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.