2010-11-09 79 views
2

例如,下面的代码(箭头指向两部分)可以使用第一个结果而不是再次查询数据库吗? - 如果有不匹配,其中TABLE_ENTRIES.retrieved是空的任何行,那么查询如何在SQL SERVER PROCEDURE中重用选择结果

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

有没有必要检查@@ ROWCOUNT的/ etc:

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 

回答

4

在UPDATE语句中使用CTE没有什么可更新的。

文档

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)  

,如果你想显示第一次查询的结果,如果行数在第一查询返回的改善更新性能这只会是有益的。