【问题标题】:Issue in T-SQL while checking null variable检查空变量时在 T-SQL 中出现问题
【发布时间】: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


【解决方案1】:

删除了所有这些标量变量后,情况相同。

IF EXISTS
(
    SELECT *
    from inserted
    where N_CATCompta = 4
        AND 
        (
            ISNULL([Exon N°], '') = '' 
            OR 
            ISNULL([Date début], '') = '' 
        ) 
)   
     RAISERROR('false',11,1)

【讨论】:

  • 非常感谢,效果很好,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2014-08-03
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多