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))
我有一个 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))