前几天我正在开发一个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个“如果是”,以及最后一个“结束”和“去”时指责错误。有谁知道更好的解决方案吗?提前谢谢!
答案 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;