Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server 2012中触发器内的Update语句_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

sql server 2012中触发器内的Update语句

sql server 2012中触发器内的Update语句,sql,sql-server,sql-server-2012,Sql,Sql Server,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 100000

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

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的观点,即改变插入到表中的值的触发器可能不是最佳选择,检查约束更好

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

ALTER TABLE MYTABLE
    ADD CONSTRAINT CK_MYTABLE_DESC CHECK ([DESC] NOT LIKE '"%' AND [DESC] NOT LIKE '%"');
GO
这将阻止
[DESC]
列(糟糕的名称,顺便说一下)以
开头或结尾的任何行

如果您真的想使用触发器进行插入,下面是我将如何编写它:

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语句,并且它使用插入的
伪表的内部联接来更新表,因此它只影响新行


您收到任何错误消息吗?@ErayBalkanli:没有错误消息,但更新发生在同一个表上,该表上的任何SQL Server触发器都无法引用插入的
或删除的
(或两者兼而有之)很可能是坏的。在这里,插入表后,您将扫描表中当前包含的所有行,而不仅仅是刚刚插入的行。@Damien_异教者:有什么办法处理它吗?另外,您真的想允许人们插入“错误”数据并无声地“更正”吗”“是吗?更正常的/预期的是应用
检查
约束,以防止人们首先插入错误的数据。非常感谢,如果我必须从15列中删除坏字符,它会起作用吗。@TULSI我不确定我是否理解你的评论。我的答案是基于这个问题。它获得了发布时所需的结果。如果您在使其适应实际的表和数据时遇到问题,那么问题可能过于简化了。要影响15列,您需要在update语句中解决所有这些问题。但说真的,悄悄地更改所有列上的数据是一个巨大的危险信号,表明您的应用程序在很多方面做得很糟糕。这应该在应用程序中修复,并且不允许首先输入错误数据。然后是一个约束,以防止它毒害数据库。在触发器中以静默方式更改数据是错误的。我的意思是,在DDL中,我给出了一个只有1列DESC的示例,如果在其他列中有相同的坏字符,它会起作用吗?我将它们添加到逻辑中。您必须稍微更改一下,我将更新我的答案以反映这一点。