MicrosoftSQLServer

MSSQL ServerでALTER SEQUENCE RESTART WITH (SELECT MAX(id))みたいにしたかった.

2020/01/06

背景

現在勤めている会社のシステムでは, 採番テーブルが採用されている.
しかし, とある(自分とは全く関係ない)プロジェクトでシークエンスオブジェクトに切り替えることになった.

ですが, 考慮不足?によりバージョンアップ時に実際のテーブルのIDよりシークエンスの値が小さくなってしまい, プログラム(実際はスレッド)を動かすと主キーの重複エラーが起こるように...

それがは12月24日のこと...

そのデータメンテナンスを本日行おうとした際に, とあるテーブルの最大値をシークエンスの値として設定したかったのですが, 思ったより躓いたので記録する.

結論

ストアドプロシージャを利用する.

DECLARE @resetSQL nvarchar(255) = 'ALTER SEQUENCE [シークエンス名] RESTART WITH ' + (SELECT CAST(MAX([列名]) + 1 as nvarchar(10)) FROM [シート名]);

exec sp_executesql @resetSQL

SQL ServerにはSETVAL的なものはなさそう?

1時間ほど, ALTER SEQUENCEでサブクエリ?を実行する方法を調べたのですが, 見つかりません...

その際に見つけたのがここら辺の記事!
How to reset postgres' primary key sequence when it falls out of sync?
Alter sequence restart with selected value...
How to reset a sequence with PostgreSQL
PostgreSQLでも僕のような悩みを抱えている人は多く, SETVALを利用して解決したという話が多くあった.
これが地獄の始まり...

早速SQL Serverで利用しようとしますが, SETVALなんてものはありません.
ここでMicrosoft SQL Serverにも同じような機能があると思い込んでしまい, 時間を無駄に使うことになってしまった...

DBに関する知識不足を痛感した一日...
もっと良い解決方法があればご教授いただけると幸い.

Twitterフォロー待ってます!