【问题标题】: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)
仅当您希望显示第一个查询的结果并且第一个查询中返回的行数提高了更新的性能时,这才有用。