T-SQL返回结果并继续处理

时间:2016-12-25 18:24:31

标签: sql sql-server tsql

我有一个存储过程,我希望通过从存储过程中尽早返回数据然后允许它继续处理来加速。

现在基本上我有类似的东西:

CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
    @someargshere
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    UPDATE lastAccessedTime = GETUTCDATE() WHERE based on someargs;
    SELECT some fields WHERE based on someargs;
END

我实际上并不关心last {CcessedTime对于SELECT语句是什么,但我发现返回行结果集的唯一方法是在最后执行SELECT,因为所有我发现的文档说RETURN只接受一个整数表达式。我希望尽早返回结果,以便为应用程序提供尽可能绝对最快的响应时间,以便在服务器执行更新时继续处理。所以我想做一些像

这样的事情
SELECTT.....
RETURN results to app
UPDATE after connection has sent results

这可能还是有更好的方法呢?

1 个答案:

答案 0 :(得分:6)

不,不要认为你能做到这一点,因为这是一个顺序处理。此外,即使你能够做到这一点,你最终会读取旧数据而不是实际更新的数据;这也称为DIRTY READ

您在第一部分发布的内容是正确的。首先执行UPDATE,然后执行SELECT数据并返回应用程序。只有当整个处理结束时,您的过程才会返回,而您所说的不一样(或者同样以多线程编程语言发生)。

虽然您可以根据您的应用程序编程语言(如果它支持多线程)在不同的过程/ adhoc查询中分隔SELECTUPDATE;运行两个线程,其中一个将从表SELECT运行,另一个将执行UPDATE(如果C#则可以使用TPL;特别是async - await)。虽然在这种情况下你可能需要将TRANSACTION ISOLATION LEVEL设置为READ UNCOMMITTED