2016-12-25 63 views
2

我有一个存储过程,我希望通过从存储过程中提前返回数据并随后允许它继续处理,从而加快速度。T-SQL返回结果并继续处理

基本上现在我有一些像这样:

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 

我并不真正关心什么lastAccessedTime对于SELECT声明,但我发现返回的结果集行是唯一的出路最后做SELECT,因为我发现所有文档都说RETURN只需要一个整数表达式。我希望尽早返回结果,以便我的应用程序可以获得绝对最快的响应时间,以便在继续处理的同时让服务器执行更新。所以我想做点类似于

SELECTT..... 
RETURN results to app 
UPDATE after connection has sent results 

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

+0

你不太清楚你想在SP中完成什么,但是假设你想用新的'lastAccessedTime'标记一组行,然后从这些行中返回数据,你可以通过使用[UPDATE]上的''OUTPUT'](https://msdn.microsoft.com/en-us/library/ms177564.aspx)子句将数据从受影响的行保存到临时表中。临时表中的'SELECT'将返回结果。您的当前设计,无需添加事务,允许其他用户更新“UPDATE”和“SELECT”之间的行,“OUTPUT”会阻止某些行。 – HABO

回答

6

不,你不认为你可以这样做,因为它是一个顺序处理。而且,即使你能够做到这一点,那么你将最终读取旧数据,而不是实际更新数据。这也被称为DIRTY READ

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

尽管您可以根据您的应用程序编程语言(如果它支持多线程)在不同的过程/自定义查询中分开SELECTUPDATE;有两个线程运行,其中一个将从表SELECT和另一个将执行UPDATE(如果C#那么你可以使用TPL;特别是async - await)。尽管在这种情况下您可能必须将TRANSACTION ISOLATION LEVEL设置为READ UNCOMMITTED

+1

_“将不同的程序/特殊目录中的SELECT和UPDATE分开”_ - upvoted。 –

+0

我很满意阅读旧数据,因为我正在阅读的不是我正在更新的内容 – csteifel

相关问题