繁体   English   中英

SQL Server 2012中触发器内部的更新语句

[英]Update Statement Inside Trigger in sql server 2012

我创建了一个插入触发器,一旦数据完全插入,它必须运行一些更新查询。

DDL

    CREATE TABLE DEMO
    (
    MASTERID INT,
    PRICEINCVAT FLOAT,
    [DESC] VARCHAR(50)
    )   
    INSERT DEMO

    SELECT 1000001, 25.69,   '"Bremsbelagsatz, Scheibenbremse " ' UNION ALL
    SELECT 1000001, 62.58, '"Bremsbelagsatz, Scheibenbremse "   '   

触发:

CREATE TRIGGER [dbo].[anUpdate] ON [dbo].[DEMO]
After Insert
AS

set nocount on

BEGIN


UPDATE [dbo].[DEMO]
SET [DESC] = SUBSTRING([DESC], 2, LEN([DESC]))
WHERE LEFT([DESC], 1) = '"'


UPDATE [dbo].[DEMO]
SET [DESC] = SUBSTRING([DESC], 1, LEN([DESC])-1)
WHERE RIGHT([DESC], 1) = '"'
END

但是触发器未能触发。

有什么办法可以处理这种情况。 我想使用触发器来做到这一点。 请分享您的想法。

期望值:从列中删除了开头和结尾的坏字符。

MASTERID    PRICEINCVAT DESC
1000001     25.69       Bremsbelagsatz, Scheibenbremse 
1000001     62.58       Bremsbelagsatz, Scheibenbremse

我同意Damien和Sean的观点,认为更改表中插入值的触发器可能不是最佳选择,而检查约束则更好。

要添加检查约束,请使用ALTER TABLE语句-如下所示:

ALTER TABLE MYTABLE
    ADD CONSTRAINT CK_MYTABLE_DESC CHECK ([DESC] NOT LIKE '"%' AND [DESC] NOT LIKE '%"');
GO

这将防止[DESC]列(可怕的名称,BTW)以"开头或结尾的任何行。

如果您真的想使用触发器进行插入,请按照以下方式编写它:

CREATE TRIGGER [dbo].[anUpdate] ON [dbo].[MYTABLE]
AFTER INSERT
AS
BEGIN

    SET NOCOUNT ON;

    UPDATE T
    SET [DESC] = CASE 
                    WHEN I.[DESC] LIKE '"%"' THEN SUBSTRING(I.[DESC], 2, LEN(I.[DESC])-2)
                    WHEN I.[DESC] LIKE '"%' THEN RIGHT(I.[DESC], LEN(I.[DESC])-1)
                    WHEN I.[DESC] LIKE '%"' THEN LEFT(I.[DESC], LEN(I.[DESC])-1)
                    ELSE I.[DESC]
                END,
        Col =  CASE 
                    WHEN I.Col LIKE '"%"' THEN SUBSTRING(I.Col, 2, LEN(I.Col)-2)
                    WHEN I.Col LIKE '"%' THEN RIGHT(I.Col, LEN(I.Col)-1)
                    WHEN I.Col LIKE '%"' THEN LEFT(I.Col, LEN(I.Col)-1)
                    ELSE I.Col
                END
    FROM MYTABLE As T
    -- Assuming your primary key is a column called Id...
    INNER JOIN Inserted AS I ON I.Id = T.Id
    WHERE I.[DESC] LIKE '"%' 
    OR I.[DESC] LIKE '%"'
    OR I.Col LIKE '"%' 
    OR I.Col LIKE '%"';
END
GO

请注意,它仅使用单个update语句,并且使用对inserted伪表的内部联接来更新表,因此仅影响新行。

您可以在rextester上看到这两个选项的现场演示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM