sql-server - INSERT TRIGGERS 和 UPDATE() 函数

标签 sql-server sql-server-2005 t-sql triggers

我已在数据库中的 View 上创建了 INSTEAD OF INSERT 触发器。我想知道 View 上的 INSERT 语句的列列表中包含哪些列。

如果您阅读有关触发器的 MSDN 文档,则 UPDATE() 和 COLUMNS_UPDATED() 函数应该满足此要求。但是,在测试过程中,我发现无论 INSERT 列列表中有哪些列,UPDATE() 和 COLUMNS_UPDATED() 函数始终返回 View 中的所有列。

CREATE VIEW dbo.MyView (BatchId, [Status], OrderNumber, WhenClosed) AS
    SELECT bth.BatchId, bth.[Status], bth.OrderNumber,
            Private.ufxAdjustDateTime(bth.WhenClosed, bth.WhenClosedUtcOffset)
        FROM Private.Batch AS bth
GO
CREATE TRIGGER dbo.[MyView-Insert] ON dbo.MyView INSTEAD OF INSERT AS
BEGIN
    SET NOCOUNT ON

    DECLARE @batchIdIsSet BIT

    SELECT @batchIdIsSet = 0
    IF UPDATE(BatchId)
        SELECT @batchIdIsSet = 1

    INSERT INTO Private.Batch
        (BatchId, [Status], OrderNumber)
        SELECT CASE @batchIdSet
                   WHEN 1 THEN ins.BatchId
                   ELSE NEWID()
               END, ins.[Status], ins.OrderNumber
            FROM inserted AS ins
END

我想要这样做的原因是我需要修改现有的表,并且我有大量依赖于它的遗留代码。所以我所做的就是创建一个新表,将旧表更改为 View ,并在 View 上创建触发器,以允许 INSERT、UPDATE 和 DELETE 语句。

现在,旧表对某些列有默认值,如果插入 View 使用默认值,我想在插入新表时使用默认值。为此,我必须能够找出哪些列[显式]为 INSERT 提供了值。

检查列是否有 NULL 是不够的,因为 INSERT 语句可以显式地将字段值设置为 NULL,这是完全可以接受的。

嗯,我希望这是清楚的。 保持。

最佳答案

在 INSERT 语句中,每一列都会受到影响。它要么获取 NULL,要么获取您指定的值。

检查 NULL 将是最好的选择,但由于你不能这样做,我认为你可能会有点卡住。您能找出可能需要显式处理 NULL 的场景吗?

关于sql-server - INSERT TRIGGERS 和 UPDATE() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2083910/

相关文章:

sql-server - 通过 TCP/IP 连接到外部托管计算机上的 2014 SQLEXPRESS 数据库

sql - 如何在不指定列名的情况下从另一个表更新一个表?

sql - 有相同 child 的 parent 分组

sql-server - 如何在 .cfc 文件中的一个 DELETE 语句中从多个表中删除?

sql-server - 从表中删除 NULL 且具有相同 DATE 的行

sql - Sybase:如何连接 sybase 列中的行

java - SQL Server : Data more fractional digits in Java

mysql - 检查是否存在。如果存在则不插入数据,如果不存在则插入数据

c# - SQL Server 与 MongoDB : Speed test?

sql-server - sql双多列键