私は本当に複数のインデックスを再構築するためのカーソルが必要なので、私の質問は種類の他のものとは異なります。しかし、私はすでにカーソルにいて更新をしているという事実を利用したい。ここで さらに "カーソルは読み取り専用です。"
は、SQLコードです:USE [MyDB]
DECLARE @TableName NVARCHAR(128)
DECLARE @IndexName NVARCHAR(128)
DECLARE @Sql NVARCHAR(MAX)
BEGIN TRY
DECLARE c CURSOR LOCAL FORWARD_ONLY KEYSET SCROLL_LOCKS FOR
SELECT TableName,IndexName
FROM _NonClusteredIndices_ i
JOIN _Candidates_ c ON i.ObjectId = c.ObjectId
WHERE State = 1
ORDER BY TableName,IndexName
FOR UPDATE OF i.State
OPEN c
FETCH NEXT FROM c INTO @TableName,@IndexName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Sql = 'ALTER INDEX [' + @IndexName + '] ON [' + @TableName + '] REBUILD'
EXEC(@Sql)
UPDATE _NonClusteredIndices_ SET State = 2 WHERE CURRENT OF c
FETCH NEXT FROM c INTO @TableName,@IndexName
END
CLOSE c
DEALLOCATE c
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
ああ、私は取得カーソルが読み込まれONLY
なぜ?どうすれば修正できますか?
EDIT
二つのテーブルのDDLである:表の
USE [MyDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[_Candidates_](
[ObjectId] [int] NOT NULL,
[ClientIdColumnId] [int] NOT NULL,
[TableName] [nvarchar](128) NOT NULL,
[ClientIdColumnName] [nvarchar](128) NOT NULL,
[RowCount] [bigint] NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[_NonClusteredIndices_](
[ObjectId] [int] NOT NULL,
[IndexName] [nvarchar](128) NOT NULL,
[State] [int] NOT NULL DEFAULT ((0))
) ON [PRIMARY]
(おっと、間違ったテーブルに記載されている)
なしを除いて、任意のインデックスまたは制約を持ちません_NonClusteredIndices_.State
カラムのデフォルト制約
あなたは、両方のテーブルのDDLを提供することができます。別の方法として
は、私はあなたが完全にCURSOR
を取り除くとセットベースのクエリを使用してこれを行う示唆しますか? –私はその投稿を読んで、 'LOCAL FORWARD_ONLY KEYSET SCROLL_LOCKS'を追加するように指示しましたが、ダイスはまだありません。それ以外は、私が間違っていることを理解していません。あなたがそれを見れば、私は何かを逃しているかもしれない - 共有してください。 – mark
DDLを追加しました... – mark