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 に答える