【问题标题】:SQL trigger insert new variableSQL 触发器插入新变量
【发布时间】:2021-06-15 14:38:29
【问题描述】:

当使用触发器使用新行更新表时,我正在尝试根据特定条件填充列。

这是我写的。

create trigger [myschema].[charD] 
on [myschema].[deposits]
after update
as
begin
    set nocount on;

    update myschema.deposits
        set dayC = (convert(varchar, day, 23))
    from myschema.deposits
    where dayC is null
end
GO

当添加新行时,这不会更新或填充列 dayC,我在这里缺少什么?

【问题讨论】:

  • 因为你有after update 而不是after insert。此外,您应该从不在不指定长度的情况下使用varchar,例如varchar(64)(但使用适合您的应用程序的任何值)。
  • 谢谢你戴尔,我会试试你的建议
  • inserted表怎么了,你不用吗?请记住,触发器触发一次每个语句而不是每行一次,因此inserted 可以有多行
  • 我以这种方式更新了代码create trigger [myschema].[charD] on [myschema].[deposits] after insert as begin set nocount on; update myschema.deposits set dayC = (convert(varchar, a.day, 23)) from myschema.deposits a left join inserted i on a.id=i.id and a.test=i.test and a.day=i.day where i.dayC is null end go

标签: sql-server tsql triggers


【解决方案1】:

set dayC = (convert(varchar, day, 23))

看起来您正在将datedatetime 转换/格式化为YYYY-MM-DD 格式的字符串

您可以使用计算列来代替触发器

ALTER TABLE [myschema].[deposits]
    ADD [dayc] AS CONVERT(VARCHAR(10), [day], 23)

【讨论】:

    【解决方案2】:

    你需要改成after insert

    您也与inserted 表没有关联。

    您需要在 PK 上加入 inserted 以更新插入的行,否则您每次都会更新表中的所有行。

    use-the-inserted-and-deleted-tables

    【讨论】:

    • 是的,但是更新一个空列是可以的,只知道新值将为空。
    • 当然,但是加入inserted 也会产生同样的结果,谁知道呢,当有人出于某种原因想要将旧行上的值重置为 NULL 并且无法弄清楚他们的原因时会发生什么?更新神秘地不起作用...
    • 您必须了解您的业务案例,相反,您可能希望确保始终更新所有空值,即使有人偷偷地将一个设置为空。在这种情况下,它不是问题的原因,它只是一个建议。
    • 当然,只要你知道发生了什么;即便如此,如果没有可用的索引或有人更改了现有索引,由于表扫描,性能可能会随着时间的推移而逐渐下降——在大声笑之前看到过。正如你所说,这取决于。
    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多