触发器插入NULL值(SQL Server 2012)

时间:2013-12-16 20:51:23

标签: sql sql-server mfc triggers

前几天我正在开发一个MFC应用程序,它作为我的数据库的客户端。在此应用程序中,在某些情况下,新记录的某些字段可能为空,当我用数据填充某些对象时,这将表示“零”(null)。因此,为了处理这些零值,我试图创建一个触发器,自动将这些零值替换为NULL,因此不存在任何外键冲突。这是我到目前为止所实现的:

use SomeDatabase SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create trigger SomeTrigger
on MyTable
after insert, update
as
begin
declare @Attribute1 int
declare @Attribute2 int
declare @Attribute3 int
declare @Attribute4 int
set @Attribute1 = (select Slot1 from INSERTED)
set @Attribute2 = (select Slot2 from INSERTED)
set @Attribute3 = (select Slot3 from INSERTED)
set @Attribute4 = (select Slot4 from INSERTED)
if (@Attribute1 = 0)
begin TRANSACTION
SET Slot1 NULL
end
if (@Attribute2 = 0)
begin TRANSACTION
SET Slot2 NULL
end
if(@Attribute3 = 0)
begin TRANSACTION
SET Slot3 NULL
end
if (@Attribute4 = 0)
begin TRANSACTION
SET Slot4 NULL
end
end
go

我很确定有比这更好的方法,但我认为最奇怪的是SQL Server仅在最后2个“如果是”,以及最后一个“结束”和“去”时指责错误。有谁知道更好的解决方案吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

1)如果您可以更改客户端应用程序(MFC),那么您应该这样做。

2)如果您使用存储过程来插入或更新行,那么您可以在这些SP中执行这些转换。例如:

ALTER STORED PROCEDURE dbo.MyTable_Insert
(
@Slot1 INT,
@Slot2 INT,
@Slot3 INT,
@Slot4 INT
)
AS
BEGIN
SELECT @Slot1 = NULLIF(@Slot1, 0), 
    @Slot2 = NULLIF(@Slot2, 0), 
    @Slot3 = NULLIF(@Slot3, 0), 
    @Slot4 = NULLIF(@Slot4, 0);

INSERT INTO dbo.MyTable (Slot1, Slot2, Slot3, Slot4)
VALUES (@Slot1, @Slot2, @Slot3, @Slot4);
END

3)如果你不能,那么你可以使用和INSTEAD OF触发器:

CREATE TRIGGER trgBeforeIU_SomeTrigger
ON dbo.MyTable
INSTEAD OF INSERT, UPDATE
AS
BEGIN
    INSERT INTO dbo.MyTable (Slot1, Slot2, Slot3, Slot4)
    SELECT  NULLIF(Slot1, 0), 
        NULLIF(Slot2, 0),
        NULLIF(Slot3, 0),
        NULLIF(Slot4, 0)
    FROM inserted;
END;