当前位置: 首页 > 面试题库 >

SQL分配变量与子查询

司空通
2023-03-14
问题内容

我对以下2条SQL有疑问:

declare @i1 bit, @b1 bit
declare @i2 bit, @b2 bit
declare @t table (Seq int)
insert into @t values (1)

-- verify data
select case when (select count(1) from @t n2 where 1 = 2) > 0 then 1 else 0 end
-- result 0

select @i1 = 1, @b1 = case when @i1 = 1 or ((select count(1) from @t n2 where 1 = 2) > 0) then 1 else 0 end from @t n where n.Seq = 1
select @i1, @b1
-- result 1, 0

select @i2 = 1, @b2 = case when @i2 = 1 or (0 > 0) then 1 else 0 end from @t n where n.Seq = 1
select @i2, @b2
-- result 1, 1

SQL小提琴在这里

执行之前,我认为案例部分应该是null = 1 or (0 > 0),它将返回0

但是现在,我想知道为什么第二个SQL会返回1


问题答案:

我将其作为答案发布,因为它来自Training Kit (70-461)

WHERE propertytype = 'INT' AND CAST(propertyval AS INT) > 10

一些人假设除非优先级规则另有规定,否则谓词将从左到右进行评估,并且在可能的情况下会发生短路。换句话说,如果第一个谓词属性类型=’INT’的评估结果为false,则SQL
Server将评估第二个谓词CAST(propertyval AS INT)>
10,因为结果是已知的。基于此假设,期望查询永远不会失败,无法进行可转换的转换。

但是,现实是不同的。SQL Server在内部支持短路概念。但是,由于 语言中的 概念一次性
的,因此不一定要按从左到右的顺序评估表达式。它可以基于成本相关的原因决定从第二个表达式开始,然后如果第二个表达式的计算结果为true,则也要对第一个表达式进行评估。这意味着,如果表中存在属性类型不同于“
INT”的行,并且在这些行中propertyval不能转换为INT,则由于转换错误,查询可能会失败。



 类似资料:
  • 问题内容: 我有需要变量替换以更好地使用Go-kit服务的sql查询。 我有&作为用户输入的内容,这是我的休息服务的一部分,例如:和。 我已经尝试了一些事情,例如: 和: 导致错误: 仅硬编码的值有效,替换失败。 我没有从Oracle博客那里找到很多有关此方面的帮助,并且想知道是否有任何方法可以解决此问题。 问题答案: 参数占位符语法(参考:http : //go-database- sql.or

  • 问题内容: 以下查询将在约22秒内运行: 问题出在 变量赋值上 (实际上是这一行:)。删除作业时,它最多可以加快15毫秒!我通过将结果插入到临时表中解决了这个问题,但我认为这是一种不好的方法。 任何人都可以帮助我解决问题的根源吗? 聚苯乙烯 错误的执行计划(22 s ):https : //www.brentozar.com/pastetheplan/?id=Sy6a4c9bW 良好的执行计划(2

  • 问题内容: 我是bash脚本的新手。我想将sql-query输出保存在变量中,但是 实际上,我必须使用以下命令为每个查询连接到mysql: 并希望将每个输出保存在单独的变量中 示例查询是: 到 谢谢你 问题答案: 从bash脚本中获取-从数据库中选择到变量中,您可以将查询结果读取到一个变量中。 例子 用法 是用于输出的bash命令。然后可以将其拆分为单独的变量: 您可以将这两个命令组合成一个命令:

  • 问题内容: 为SQL Server编写查询时,可以声明和使用如下变量: 在编写用于MS Access的查询时,是否有一种方法可以类似地声明和使用变量? 我需要用另一个查询的结果填充变量,然后使用该值执行插入/更新操作。该查询将从.NET应用程序运行。 问题答案: 在某种方式 但是,您不能使用,在运行查询或在VBA中设置查询时可以手动输入参数。 您可以使用System.Data.OleDb命名空间中

  • 问题内容: 我正在分析存储过程中的一些旧SQL代码。 等等… 等等… 所以我想知道当它们都在同一个select语句中时,这些赋值如何工作。我假设在调用select之后,Var2 = OldValue,但是我想确定。 围绕这种情况有哪些规则?分配是否按照声明的顺序执行?如果是这样,在以下情况下将为Var2分配什么值: 谢谢! 问题答案: 退货 因此,在这种情况下,它们以从左到右的顺序执行, 但这 不

  • 问题内容: Linux bash中确实存在类似于PHP中以下代码的内容: 也就是说,您在一个句子中为3个不同的变量分配了一个对应的值。 假设我有bash函数,该函数将stdout字符串“ qwert asdfg zxcvb”写入标准输出。是否可以做类似的事情: 等号左边的部分当然不是有效的语法。我只是想解释我的要求。 但是,有效的方法如下: 但是索引数组的描述性不如普通变量名。 但是,我可以这样做