identityのあるテーブルのMERGE

以前identityのIDのテーブルにmergeはだめと書いた件

いちいちidendityを解除してmergeして再設定していたけど面倒くさいし元に戻すのを忘れると大変なことになる
identityはそのままにmergeさせる方法
mergeのクエリの前後に

set identity_insert TABLE on
MERGE・・・・略
set identity_insert TABLE off

identityのあるテーブルのMERGE
つまり
identity設定があるテーブルのIDに任意の値の入力を可能にする
任意と言ってももちろん一意である必要あり

identity

下の続き

SSMS でテーブルデザインでidentityシードを見るといつまでも1 
になっているのでおかしいと思っていたら
最初に作ったときのデフォルト値が表示されるらしいのでずっと1なのね

訂正データベース複製とTRUNCATE@SQLserver

identityリセット
truncate table でリセットされると思っていたら維持されてました

つまりSQLserverではtruncate tableしてもidentityはリセットされない。されるのはMySQL

そこでSQLserverでは

exec sp_MSforeachtable @command1=’if objectproperty(object_id(”データベース
.?”),”tablehasidentity”)=1 dbcc checkident(”データベース
.?”,reseed,0);’

でデータベース内テーブル一括リセットOK
SSMSのテーブルデザインでidentityシード見ても変化ないけど
レコード挿入するとちゃんとリセットされてます。
SSMSのバグかな? 自分の方がバグでした

データベース複製とTRUNCATE@SQLserver

SQLserverのデータベース複製で躓く
SSMSのデータベースコピーウィザードはなぜかエラーで使えない
エクスポートウィザードでできるが主キーの設定やトリガーなどはコピーしてくれない

データベースTESTDBを一度バックアップ
復元をクリック 復元先のデータベースをTESTDBcopyに書き換えて復元
その後TESTDBは復元中になって使えなくなっているのでこちらもあらためて復元しておく

さらにコピーしたデータベースのテーブルのレコード全削除とidendityのリセット(=truncate)する
CTEで全テーブルの一括truncateを試みたがCTEはselect update delete insertしか使えないようだ
exec sp_MSforeachtable @command1=”truncate table TESTDBcopy.?”
でOK

ダメでした

クエリ強制終了

MySQLで終わらないクエリ、ループなどを強制終了するには
show processlist;
をよく見て該当のクエリを見つけて
kill クエリのid;

SQLserverでは
exec sp_who
でクエリを見つけて
kill spid

日付

dateadd(Y,1,CURRENT_TIMESTAMP)
というのをネットで見つけた

実際にクエリ発行してみると

select dateadd(Y,1,CURRENT_TIMESTAMP) は 2018-04-03 20:52:17.357

明日になる・・Yって何?
では
select format(CURRENT_TIMESTAMP,’Y’) は 2018年4月

うーむ
調べるとYはdayofyaer の略で年始からの日数

ここで謎だったVBAの
debug.Print format(now,”Y”) が 92 なのだが
これがSQLserverのdayofyearに当たることに気がついた。

ならば SQLserverの
select format(CURRENT_TIMESTAMP,’Y’) は 92 になってほしい所だが
なぜか
2018年4月