此查询在 SQL Server 2005 和 2008 中运行良好。我将如何在 SQL Server 2000 中编写它?
UPDATE TOP 10 myTable
SET myBooleanColumn = 1
OUTPUT inserted.*
除了运行多个查询之外,还有什么办法吗?
此查询在 SQL Server 2005 和 2008 中运行良好。我将如何在 SQL Server 2000 中编写它?
UPDATE TOP 10 myTable
SET myBooleanColumn = 1
OUTPUT inserted.*
除了运行多个查询之外,还有什么办法吗?
老实说,您的查询并没有真正的意义,我很难理解您的“伟大”标准。当然,它会更新 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
子句。)