例如,下面的代码,指向两部分的箭头,第二个代码可以使用第一个代码的结果,而不是再次查询数据库吗?
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
答案 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)
如果您想显示第一个查询的结果,并且第一个查询中返回的行数可以提高更新中的性能,那么这将非常有用。