Table 输入 null 验证

Table type null validation

我有一个 Guid table 类型,我声明为:

 @MyTableVariable [HELPER].[GuidIdTableType] READONLY

为了测试提案,我添加了一个空的 guid,例如:

INSERT INTO @MyTableVariable (Id) VALUES ('00000000-0000-0000-0000-000000000000')

所以我有一个 BIT 变量,如果它是空 guid 或 table 是空的,我想 return null:

  @MyTableVariable [HELPER].[GuidIdTableType] READONLY

  INSERT INTO @MyTableVariable (Id) VALUES ('00000000-0000-0000-0000-000000000000')


            DECLARE @IsAllSelected BIT = (SELECT TOP 1
                                         1
                                         FROM @MyTableVariable 
                                         WHERE ([Id] = '00000000-0000-0000-0000-000000000000' 
                                         OR [Id] IS NULL))
         SELECT @IsAllSelected

在这种情况下它 return 1 因为它有空的 guid,所以这是正确的,但是如果我从脚本中删除空的 guid 为:

 @MyTableVariable [HELPER].[GuidIdTableType] READONLY


                DECLARE @IsAllSelected BIT = (SELECT TOP 1
                                             1
                                             FROM @MyTableVariable 
                                             WHERE ([Id] = '00000000-0000-0000-0000-000000000000' 
                                             OR [Id] IS NULL))
             SELECT @IsAllSelected

它 returns null,WHERE 子句 OR [Id] IS NULL 无效,应该它也应该 returns 1 因为它是空的。我做错了什么?

正如 Joren 指出的那样,当记录集 return 没有行时,您将获得分配给变量的 NULL 值。

你的写法是:

DECLARE @IsAllSelected BIT = ISNULL((SELECT TOP 1 1 FROM @MyTableVariable
        WHERE ([Id] = '00000000-0000-0000-0000-000000000000' OR [Id] IS NULL)), 0 )

当找到记录时变量将设置为 1 或当找不到记录时设置为 0。

关于TOP 1的一些说明:

TOP 1 确保表达式在两(或更多)行被 returned 时不会抛出错误。否则在这种情况下是没有用的。

另一种方法是使用 COUNT(*) 因为这总是 return 一个值:

DECLARE @IsAllSelected BIT = (SELECT COUNT( * ) FROM @MyTableVariable
        WHERE ([Id] = '00000000-0000-0000-0000-000000000000' OR [Id] IS NULL))