2010-11-09 82 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)  

,如果你想顯示第一次查詢的結果,如果行數在第一查詢返回的改善更新性能這隻會是有益的。