0

此查询在 SQL Server 2005 和 2008 中运行良好。我将如何在 SQL Server 2000 中编写它?

UPDATE TOP 10 myTable
SET myBooleanColumn = 1
OUTPUT inserted.*

除了运行多个查询之外,还有什么办法吗?

4

1 回答 1

3

老实说,您的查询并没有真正的意义,我很难理解您的“伟大”标准。当然,它会更新 10 行,并且不会出错。但是你真的不在乎它更新了哪 10 行吗?您当前TOP没有ORDER BY建议您希望 SQL Server 决定要更新哪些行(这正是它要做的)。

要在 SQL Server 2000 中完成此操作(不使用触发器),我认为您需要执行以下操作:

SET NOCOUNT ON;

SELECT TOP 10 key_column
INTO #foo
FROM dbo.myTable
ORDER BY some_logical_ordering_clause;

UPDATE dbo.MyTable
SET myBooleanColumn = 1
FROM #foo AS f
WHERE f.key_column = dbo.MyTable.key_column;

SELECT * FROM dbo.MyTable AS t
INNER JOIN #foo AS f
ON t.key_column = f.key_column;

如果你想要一个简单的查询,那么你可以有这个触发器:

CREATE TRIGGER dbo.upd_tr_myTable
ON dbo.myTable
FOR UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  SELECT * FROM inserted;
END
GO

请注意,此触发器无法判断您是在执行 TOP 10 更新还是其他内容,因此所有用户在执行更新时都会获得此结果集。即使您在 IF UPDATE(myBooleanColumn) 上进行过滤,其他用户仍可能更新该列。

在任何情况下,您仍然需要修复更新语句,以便知道要更新哪些行。(你甚至可以考虑一个WHERE子句。)

于 2012-04-26T18:26:01.580 回答