如果我有一个 SQL 查询正在对三个表执行存在性检查:
IF EXISTS(SELECT [KEY] FROM [Table1] WHERE [KEY]='Key1')
AND EXISTS(SELECT [KEY] FROM [Table2] WHERE [KEY]='Key2')
AND EXISTS(SELECT [KEY] FROM [Table3] WHERE [KEY]='Key3')
- SQL Server 是否支持条件语句的“提前退出”,以便如果针对 [Table1] 的初始存在检查返回 false,则不会执行其余两个存在检查?
- 假设 Microsoft SQL Server 作为后端,我希望在三个引用的表上看到什么锁定行为,同样假设针对 Table1 的初始存在检查将返回 false?
使用函数而不是实际查询进行的一些基本测试表明支持“提前退出”,但查询执行期间的锁分析还表明在所有三个表上都获取了锁,这与“提前退出”的结果相矛盾。
SQL Server 是否会获取查询中所有表的锁,以防以后需要它们?
最佳答案
SQL Server确实执行短路计算,但您无法控制它选择计算子句的顺序,除非您通过 CASE
语句执行此操作。
关于使用连词执行查询时的 SQL 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022078/