Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 2008 在变量T-SQL中选择COUNT(*)>_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 在变量T-SQL中选择COUNT(*)>

Sql server 2008 在变量T-SQL中选择COUNT(*)>,sql-server-2008,tsql,Sql Server 2008,Tsql,这应该很容易,但由于某些原因,我无法获得SQL Server 2008的正确语法 如果一个表有列,我需要我的变量为true,否则它应该为false 到现在为止,我有这个 DECLARE @LEHasSessions bit set @LEhasSessions = ((SELECT COUNT(*) FROM @LEForSession) > 0) 这显然不是编译 语法应该如何才能工作?SQL Server没有布尔数据类型。使用案例X,然后使用1,否则使用0 此外,最好在此处使用EXI

这应该很容易,但由于某些原因,我无法获得SQL Server 2008的正确语法

如果一个表有列,我需要我的变量为true,否则它应该为false

到现在为止,我有这个

DECLARE @LEHasSessions bit

set @LEhasSessions = ((SELECT COUNT(*) FROM @LEForSession) > 0)
这显然不是编译


语法应该如何才能工作?

SQL Server没有布尔数据类型。使用案例X,然后使用1,否则使用0

此外,最好在此处使用EXISTS而不是COUNT,这样它可以在读取第一行后停止处理,而不是对表中的所有行进行计数

SET @LEHasSessions = CASE
                       WHEN EXISTS(SELECT *
                                   FROM   @LEForSession) THEN 1
                       ELSE 0
                     END 

实际上,您可以将@LEHasSessions设置为COUNT*的输出。输出将被截断为目标数据类型允许的最大值。因此,对于一个位,即使是522078的值也将被截断为1,0将为0

为了满足性能问题,有必要使用SELECT TOP 1*FROM@LEForSession,而不仅仅是直接从表中进行选择,因为它减少了从扫描整个表到只扫描表中一页的一条记录的逻辑读取

DECLARE @LEHasSessions BIT;

SELECT @LEhasSessions = COUNT(*) 
FROM (SELECT TOP 1 * FROM @LEForSession) a
;

PRINT @LEHasSessions;

@马丁史密斯:执行计划与你相符。您的查询和我的查询都会导致表扫描,因为此内存表上没有索引,但是您的查询会导致1次逻辑读取,而我的查询会导致13次使用Adventure Works 2012的Production.Product。自从这篇评论以来,我已经读了一些关于计数与存在的概念的书,现在我将其提交给未来的编码实践。@MartinSmith我今天与一位高级同事讨论了这个概念,并发现了另一种方法,可以在不牺牲语法的情况下获得与IF-EXISTS查询相同的每个静态io的性能我的计数*查询的简单性。我已经用新的解决方案编辑了我的答案。此代码只导致1次逻辑读取,因为它也会在1条记录处停止,而不是读取表中的每一页。是的,这将避免此问题。但我不确定我是否同意:简单。对我来说,存在似乎是一种更自然的表达方式。
DECLARE @LEHasSessions BIT;

SELECT @LEhasSessions = COUNT(*) 
FROM (SELECT TOP 1 * FROM @LEForSession) a
;

PRINT @LEHasSessions;