Sql 表类型空验证
我有一个Guid表类型,我声明为:Sql 表类型空验证,sql,sql-server,tsql,sql-server-2017,Sql,Sql Server,Tsql,Sql Server 2017,我有一个Guid表类型,我声明为: @MyTableVariable [HELPER].[GuidIdTableType] READONLY 为了测试Propouse,我添加了一个空guid,如: INSERT INTO @MyTableVariable (Id) VALUES ('00000000-0000-0000-0000-000000000000') 因此,我有一个位变量,如果guid为空或表为空,我希望返回null: @MyTableVariable [HELPER].[Gu
@MyTableVariable [HELPER].[GuidIdTableType] READONLY
为了测试Propouse,我添加了一个空guid,如:
INSERT INTO @MyTableVariable (Id) VALUES ('00000000-0000-0000-0000-000000000000')
因此,我有一个位变量,如果guid为空或表为空,我希望返回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
在本例中,它返回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
它返回null,
其中
子句或[Id]为null
无功,假定它也应该返回1,因为它是空的。我做错了什么?正如Joren指出的,当记录集不返回任何行时,您将得到分配给变量的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
关于顶部1的一些注释:
TOP 1
确保在返回两(或更多)行时表达式不会抛出错误。否则,它在这种情况下是无用的
另一种方法是使用COUNT(*)
,因为这将始终返回一个值:
DECLARE @IsAllSelected BIT = (SELECT COUNT( * ) FROM @MyTableVariable
WHERE ([Id] = '00000000-0000-0000-0000-000000000000' OR [Id] IS NULL))
您将测试
NULL
的列值与返回零行计数混淆。在第二个示例中没有要返回的行,这就是为什么您会收到NULL
result@Martin我明白你的意思。但如果我这样做:DECLARE@MyTableVariable INT=(从@MyTableVariable中选择COUNT([Id]),如果(@MyTableVariable=0)开始插入@MyTableVariable(Id)值('00000000-0000-0000-0000-00000000000000')结束
。我不能,因为表变量是我存储过程的一个参数,READONLY
,那么我如何解决这种情况呢?声明@IsAllSelected BIT=(当存在时选择case(从@MyTableVariable中选择1,其中ID='0000…')或不存在时(从@MyTableVariable中选择1),然后选择1,否则0结束)
应该这样做。(免责声明:未测试)。但是你应该认真考虑测试是否存在一个全零的GUID——如果我通过一个包含GUID和一组有效GUID的表,那该怎么办?为什么不只是用一种方法来指定应该选择的所有内容?