2015年7月28日火曜日

SQLServer での Truncate Table 使用上の注意

SQLServer でテーブルの構造を残して、データだけ削除する際には、
Delete From T_hogehoge
ですが、
TRUNCATE TABLE T_hogehoge
のほうが圧倒的に高速に削除できます。

今まで、これを多用していました。

別途、Index付ビュー という、これも高速化するためのもので、
通常のビューはIndexをつけることができませんが、
ちょっと細工をすることで、Index付ビューにすることができて、
そのビューに対する検索が高速になります。

ところが、困ったことが判明しました。

「TRUNCATE TABLE は Index付ビューで参照しているテーブルに対して実行でき
ない。」

これを知らずに、Index付ビューを設定する前に書いたストアドを流していまし
たが、
途中で、Index付ビューを作ったために、その後の処理が全部落ちてました。

しかも、自動実行的なストアドだったので、実行されているように見えてて、
ここ半年の処理が・・・(T-T)

2015年7月16日木曜日

他のユーザーが同じデータに対して同時に変更を試みているので、プロセスが停止しました。???

SQLServer にAccess でリンクを張っている場合で、特定の条件にあてはまると、
「他のユーザーが同じデータに対して同時に変更を試みているので、プロセスが停止しました。」というエラーが表示され、更新ができなくなります。

これは、SQLServer のテーブルに「Bit」型のフィールドがあって、そのフィールドに「Null」が入力されてしまった場合に発生します。

SQLServer の「Bit」型フィールドに、Access からリンクを張ると、「Yes/No」型として扱われます。

Access では「Yes/No」型にはNullがあり得ますが、SQLServer 側の「Bit」型では、Null許容にしていても、Nullは許されません。

なので、Access から追加クエリー等でBit型のフィールドにNullを送ってしまうと、そのレコードはもうAccessから編集できなくなって、表題のエラーが表示されます。

困ったことに、このエラー表示を見て、この現象を思いつくことが難しいです。
なので、同じ過ちをしても、なかなかすぐにこれを思い出すことができず、ネットを彷徨うことになります。

解決は簡単で、Bit型のフィールドを「0」か「1」のどちらかで埋めれば以後編集することができるようになります。

2015年7月6日月曜日

SQLServer のリンクサーバー上のテーブルリストを取得

SQLServer で Oracle へのリンクサーバーを作れば、SSMS を使って、比較的簡単にOracle 上のデータにアクセスできるようになります。

ただ、リンクサーバー上にたくさんのテーブルがある場合、そのすべてのテーブルに接続するビューをちまちまと手作業で作るのは、結構邪魔くさい。
そうなると、Oracle 上のテーブルやビューの一覧が欲しくなります。

もちろん、リンクサーバーを見れば一覧は見れますが、一覧データとして扱いたいです。

そこで、SQLServer 上のストアドとして、「SP_Tables_EX」があります。

使用例(リンクサーバー名を「hoge」とする。)
テーブル一覧の取得
EXEC SP_Tables_ex @table_server = 'hoge',@table_type = 'table'

ビュー一覧の取得
EXEC SP_Tables_ex @table_server = 'hoge',@table_type = 'View'



これで一覧を取得すれば、リンクサーバー上のすべてのテーブルに接続するビューなどを作るスクリプトを書くことができます。