このクエリは、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
(句を検討することもできます。)