小编Gor*_*off的帖子

串联物理操作:是否保证执行顺序?

在标准 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 核机器上进行的,并且大多数查询确实利用了并行性。

sql-server execution-plan database-internals union

13
推荐指数
2
解决办法
1585
查看次数

处理使用 insert-exec 块调用的存储过程中的异常

我有一个在 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)

sql-server-2008 sql-server

11
推荐指数
1
解决办法
3万
查看次数