在标准 SQL 中,union all不保证a 的结果按任何顺序排列。所以,像这样:
select 'A' as c union all select 'B'
Run Code Online (Sandbox Code Playgroud)
可以以任何顺序返回两行(尽管实际上在我知道的任何数据库上,'A' 都会出现在 'B' 之前)。
在 SQL Server 中,这变成了使用“串联”物理操作的执行计划。
我可以很容易地想象连接操作会扫描它的输入,返回任何有可用记录的输入。但是,我在网络上发现了以下声明(此处):
Query Processor 将按照操作符出现在计划中的顺序执行这个计划,第一个是最上面的,最后一个是最后一个。
问题:这在实践中是真的吗?这能保证是真的吗?
我还没有在 Microsoft 文档中找到任何参考资料,说明按顺序扫描输入,从第一个到最后一个。另一方面,每当我尝试运行它时,结果表明输入确实是按顺序处理的。
有没有办法让引擎一次处理多个输入?我的测试(使用比常量更复杂的表达式)是在支持并行的 8 核机器上进行的,并且大多数查询确实利用了并行性。
我有一个在 insert-exec 块中调用的存储过程:
insert into @t
exec('test')
Run Code Online (Sandbox Code Playgroud)
如何处理存储过程中生成的异常并继续处理?
下面的代码说明了这个问题。我想要做的是根据内部exec()调用的成功或失败返回0或-1 :
alter procedure test -- or create
as
begin try
declare @retval int;
-- This code assumes that PrintMax exists already so this generates an error
exec('create procedure PrintMax as begin print ''hello world'' end;')
set @retval = 0;
select @retval;
return(@retval);
end try
begin catch
-- if @@TRANCOUNT > 0 commit;
print ERROR_MESSAGE();
set @retval = -1;
select @retval;
return(@retval);
end catch;
go
declare @t table (i int); …Run Code Online (Sandbox Code Playgroud)