我创建了一个插入触发器,一旦完全插入数据,就必须运行一些更新查询。
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
答案 0 :(得分:2)
我同意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
请注意,它只使用一个更新语句,它使用内部联接更新表到inserted
伪表,因此它只影响新行。