我想创建触发器来更新基于多个字符串过滤器的列中插入或更新的值
Posted
技术标签:
【中文标题】我想创建触发器来更新基于多个字符串过滤器的列中插入或更新的值【英文标题】:I want to create trigger to update inserted or updated value in a column based on multiple string filter 【发布时间】:2021-11-13 10:08:48 【问题描述】:我有一个名为tbl_A
的表,其中有一列名为DESC
。
旧应用程序在此 DESC
列中插入和更新值,例如 'H PP'
或 'H CC'
或 'CR BB'
。
我想用'HPP'
或'HCC'
或'CRBB'
替换那些插入的值。或者你可以说我想删除字符串之间的空格。
到目前为止,这是我的触发器:
CREATE TRIGGER TrgUpd
ON Tbl_A
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE Tbl_A
SET desc = 'HPP'
FROM Tbl_A A
INNER JOIN UPDATED u ON a.id = u.id
WHERE u.desc = 'H PP'
END
【问题讨论】:
SO 不是免费的代码编写服务,到目前为止您研究和尝试了什么?你到底有什么问题? @stu 我很抱歉使用这样的词。我不是开发人员。刚开始学。我为单个条件编写但不能为多个条件编写代码 SQL Server 触发器中没有UPDATED
伪表 - 您只有 Inserted
(对于新值 - 在 INSERT 或 UPDATE 之后)和 Deleted
(对于已删除的行 - 或 UPDATE 场景中的旧版本,在更新发生之前使用旧值)
@marc_s 是的,我更新了..谢谢
您正在获取答案所需的元素。无论如何,您应该参考执行触发器时发现的问题。
【参考方案1】:
SQL Server 触发器中没有UPDATED
伪表。在您的情况下,您必须检查包含“旧”值的 Deleted
伪表 - 那些在 UPDATE
发生之前的值。另外:你可以剪掉空格 - 像这样:
CREATE TRIGGER TrgUpd
ON Tbl_A
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE A
SET [Desc] = REPLACE(d.[Desc], ' ', '')
FROM Tbl_A A
INNER JOIN Deleted d ON a.id = d.id
END
更新:如果您想明确指定要替换的字符串 - 使用此代码:
CREATE TRIGGER trg_upd_inrt
ON [dbo].[tbl_A]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE A
SET [Desc] = CASE i.[Desc]
WHEN 'HR DD' THEN 'HRDD'
WHEN 'H PP' THEN 'HPP'
WHEN 'RPT AR' THEN 'RPTARIN'
WHEN 'APPP PPLE' THEN 'APPLE'
WHEN 'HR DD' THEN 'HRDD'
END
FROM tbl_A a
INNER JOIN inserted i ON a.id = i.id
END
【讨论】:
@ArunVishwakarma: 嗯 -INSERT
触发器没有 Deleted
伪表 - 只有 Inserted
- 但是是的,基本上,同样的方法也适用于此跨度>
它运作良好...谢谢
出现错误:消息 217,级别 16,状态 1,过程 trg_upd,第 7 行 [批处理开始行 0] 超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。
@ArunVishwakarma:如果这个答案帮助你解决了你的问题,那么请accept this answer。这将表达您对花费自己的时间帮助您的人们的感激之情。以上是关于我想创建触发器来更新基于多个字符串过滤器的列中插入或更新的值的主要内容,如果未能解决你的问题,请参考以下文章