【发布时间】:2016-06-25 23:31:18
【问题描述】:
我正在像这样在 SQL Server 中编写触发器
DECLARE @N_CATComp smallint, @EXON varchar(69), @DATEDEB varchar(15), @DATEFIN varchar(15)
SELECT
@N_CATComp = N_CATCompta,
@EXON =[Exon N°],
@DATEDEB = CONVERT(varchar(15), [Date début] , 103),
@DATEDEB = CONVERT(varchar(15), [Date début] , 103)
FROM INSERTED
IF (@N_CATComp =4) AND ( ISNULL(@EXON,'')='' OR ISNULL(@DATEDEB,'') ='' OR ISNULL(@DATEFIN,'') ='')
BEGIN
RAISERROR('false',11,1)
END
我的问题是,当@exon、@datedeb、@datefin 不为空且 catcomp=4 时会出现不应该出现的 raiserror 在这种情况下,我尝试通过例如 len(@EXON)=0 来消除 isnull ,即使这些值为 null ,那么 raiserror 也不会出现
【问题讨论】:
-
您的触发器存在重大缺陷。它错误地假设 INSERTED 中只有一行。 sql server中的触发器每次操作触发一次,触发器的内容需要处理多行操作。
-
好的,如果你有例子,你能提供给我吗
-
这里的逻辑问题是,如果您的任何变量为 NULL 或空字符串,则会引发错误。
-
我不能举个例子。您必须编写基于集合而不是基于标量值的查询。对于您在此处检查的条件,您将使用 EXISTS 并将标量变量全部删除。
-
是的,这是逻辑,但如果它们不为空,则会出现错误的 raisrror
标签: sql-server null variable-length