Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表类型空验证_Sql_Sql Server_Tsql_Sql Server 2017 - Fatal编程技术网

Sql 表类型空验证

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

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

 @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的表,那该怎么办?为什么不只是用一种方法来指定应该选择的所有内容?