Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL返回结果并继续处理_Sql_Sql Server_Tsql - Fatal编程技术网

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

T-SQL返回结果并继续处理,sql,sql-server,tsql,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 stateme

我有一个存储过程,我希望通过提前从存储过程返回数据,然后允许它在以后继续处理来加快速度

基本上现在我有这样的想法:

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

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

不,不要认为你可以这样做,因为这是一个顺序处理。此外,即使你能够做到这一点,那么你最终也会阅读旧数据,而不是实际更新的数据;这也被称为脏读

你在第一部分发布的内容是正确的。首先执行更新,然后选择数据并返回应用程序。只有当整个处理过程结束时,您的过程才会返回,而不是像您所说的或在多线程编程语言中发生的那样部分返回


尽管您可以根据您的应用程序编程语言(如果它支持多线程)在不同的过程/特殊查询中分离选择和更新;运行两个线程,其中一个将从表中选择,另一个将执行更新,如果是C,则可以使用TPL;特别是异步-等待。尽管在这种情况下,您可能必须将事务隔离级别设置为READ UNCOMMITTED。

不太清楚您在SP中要实现什么,但是,假设您希望使用新的lastAccessedTime标记一组行,然后从这些行返回数据,则可以通过在更新中使用子句将受影响行中的数据保存到临时表中来提高性能。从临时表中选择将返回结果。您当前的设计,不添加事务,允许另一个用户更新更新和选择之间的行,某些输出将排除。在不同的过程中分离选择和更新/adhoc-upvoted。我可以读取旧数据,因为我正在读取的不是我正在更新的
SELECTT.....
RETURN results to app
UPDATE after connection has sent results