如何在SQL SERVER PROCEDURE中重用选择结果

时间:2010-11-09 01:33:15

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

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

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

2 个答案:

答案 0 :(得分:4)

在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为空的行,则查询无需更新。

文档

答案 1 :(得分:1)

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

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)     

如果您想显示第一个查询的结果,并且第一个查询中返回的行数可以提高更新中的性能,那么这将非常有用。