【发布时间】:2017-11-16 09:11:12
【问题描述】:
我上次遇到以下问题,只是想知道为什么
null '值'
在触发器中不起作用。 为了解决问题,我不得不使用 isnull 函数
isnull(null,'') isnull('value','')
下面要测试的所有代码:
-- create main table
CREATE TABLE T_SAMPLE
(
ID INT,
NAME NVARCHAR(20)
)
GO
-- populate data in main table
INSERT INTO T_SAMPLE
VALUES (1, 'ONE'),
(2,'TWO'),
(3,'THREE')
GO
-- create table to store changes
CREATE TABLE T_SMAPLE_TEST
(
NAME NVARCHAR(40)
)
GO
-- create trigger on main table
CREATE TRIGGER [dbo].[TRG_SAMPLE]
ON [dbo].[T_SAMPLE]
AFTER UPDATE
AS
BEGIN
INSERT INTO T_SMAPLE_TEST
SELECT D.NAME + ',' + I.NAME
FROM INSERTED I
INNER JOIN DELETED D
ON I.ID = D.ID
WHERE D.NAME <> I.NAME
END
GO
-- ######### test #########
-- below works fine
UPDATE T_SAMPLE
SET NAME = 'ONE2'
WHERE ID = 1
GO
-- test data by running below selects
SELECT * FROM T_SMAPLE_TEST
SELECT * FROM T_SAMPLE
-- but when try to update to null value from not null or vice versa, it doesn't work
UPDATE T_SAMPLE
SET NAME = NULL
WHERE ID = 1
GO
-- test data by running below selects
SELECT * FROM T_SMAPLE_TEST
SELECT * FROM T_SAMPLE
UPDATE T_SAMPLE
SET NAME = 'AGAIN'
WHERE ID = 1
GO
-- test data by running below selects
SELECT * FROM T_SMAPLE_TEST
SELECT * FROM T_SAMPLE
-- solution for this is to alter trigger as below
ALTER TRIGGER [dbo].[TRG_SAMPLE]
ON [dbo].[T_SAMPLE]
AFTER UPDATE
AS
BEGIN
INSERT INTO T_SMAPLE_TEST
SELECT D.NAME + ',' + I.NAME
FROM INSERTED I
INNER JOIN DELETED D
ON I.ID = D.ID
WHERE ISNULL(D.NAME,'') <> ISNULL(I.NAME,'')
END
GO
/*
DROP TABLE T_SMAPLE_TEST
DROP TABLE T_SAMPLE
DROP TRIGGER TRG_SAMPLE
*/
【问题讨论】:
-
NULL是一个有点不标准的值。您无法使用=进行检查,但可以使用WHERE value IS NULL,或者在您的情况下使用WHERE I.NAME IS NOT NULL。 -
我知道这一点,但在我的情况下,我想在主表中的数据发生更改时插入数据,因此值不为空的地方不适用
-
非常感谢您输入的小伙子们,我将支持您的答案。我稍后决定应该接受哪个答案。
标签: sql sql-server triggers sql-server-2012