【问题标题】:How to reuse selection result in SQL SERVER PROCEDURE如何在 SQL SERVER PROCEDURE 中重用选择结果
【发布时间】:2010-11-09 01:33:14
【问题描述】:

例如下面的代码,箭头指向两部分,第二部分可以使用第一部分的结果,而不是再次查询数据库吗?

CREATE PROCEDURE GetInforEntries (@Count as int) AS
BEGIN   
    SELECT TOP (@Count) *
      from Table_Entries 
     where Retrived IS NULL              <----                      

    IF @@ROWCOUNT > 0
    BEGIN

      UPDATE Table_Entries 
         SET Retrived = CURRENT_TIMESTAMP
       WHERE id IN (SELECT TOP (@Count) id <----
                      from Table_Entries 
                     where Retrived IS NULL)     

    END
END

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql stored-procedures


    【解决方案1】:

    在 UPDATE 语句中使用 CTE:

    WITH sample AS (
      SELECT TOP(@count)
             te.*
        FROM TABLE_ENTRIES te
       WHERE te.retrieved IS NULL)
    UPDATE sample
       SET retrieved = CURRENT_TIMESTAMP
    

    没有必要检查@@ROWCOUNT/etc——如果TABLE_ENTRIES.retrieved为空的地方没有任何匹配的行,那么查询就没有什么要更新的了。

    文档

    【讨论】:

      【解决方案2】:

      您可以声明一个表变量或创建一个临时表来存储第一个查询的结果。

      DECLARE @MyTempTable (column-list)
      
      INSERT INTO @MyTempTable (column-list...)
      SELECT TOP(@Count) *
      FROM Table_Entries
      WHERE Retrieved IS NULL
      
      -- display results of first query
      SELECT *
      FROM @MyTempTable
      
      IF @@ROWCOUNT > 0
      BEGIN
      
        UPDATE Table_Entries 
           SET Retrived = CURRENT_TIMESTAMP
         WHERE id IN (SELECT id <----
                        from @MyTempTable)     
      

      仅当您希望显示第一个查询的结果并且第一个查询中返回的行数提高了更新的性能时,这才有用。

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 2019-10-26
        • 1970-01-01
        • 2018-06-13
        • 2013-05-17
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        相关资源
        最近更新 更多