SQL Server 2000 TOP和OUTPUT关键字

时间:2012-04-26 17:56:17

标签: tsql sql-server-2000

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

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

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

1 个答案:

答案 0 :(得分: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条款。)