ラベル SQLServer の投稿を表示しています。 すべての投稿を表示
ラベル SQLServer の投稿を表示しています。 すべての投稿を表示

2014-03-12

【SQLServer】ワイルドカード文字(パーセント、アンダースコア)をLIKEで検索する

SQLでLIKE演算子を用いて検索するとき「%」や「_」は、ワイルドカード文字として使用します。

なので、「%」や「_」を含むデータ(「5%」とか「(^_^)」みたいな文字列)を抽出したいときは、エスケープしてやる必要があります。

具体的には、LIKE句の後ろにESCAPE句を記述して、エスケープ文字を指定し
エスケープしたい文字の直前に指定したエスケープ文字を 入れます。


SELECT
    *
FROM
    [table1]
WHERE
    [field1] LIKE '%5¥%%' ESCAPE '¥'


これで、[field1]に「5%」を含むレコードが抽出されます。
エスケープ文字は、「/」とか使わない文字ならなんでも良さそうです。

また、SQLServerなら、「[ ]」(角カッコ)で囲んでも検索出来ます。


SELECT
    *
FROM
    [table1]
WHERE
    [field1] LIKE '%5[%]%'


今までそういう検索をすることがなかったので、つい最近初めて知りました。

ちょっとググったら、ESCAPE句はOracleMasterの問題とかにもなってたので、
もしかして常識なのか?

2014-03-01

【SQLServer】NOLOCKで行の欠落・重複が発生?

SQLServerは、トランザクション分離レベルの設定によっては、
SELECTでも共有ロックを取得するので、単なるSELECTでも共有ロック取得待ち
となる事がある。

一覧表示の機能などで参照のみの場合、ダーティリードしてもいいのならば
WITH(NOLOCK)ヒントをつければ解消されるが、 NOLOCKで参照すると
行の欠落、重複が発生する可能性がある。
(参考: http://support.microsoft.com/kb/975782/ja

NOLOCKでのSELECT中に、INDEXに含まれる項目の更新が発生して、
INDEXのページ分割が行われると、行の欠落や重複が起こる可能性があるらしい。
(クラスタ化でも非クラスタ化でも起こる)

そもそもNOLOCKをつける場合は、ダーティリードが発生してもいい場合なので
行の欠落はまだ許せる可能性もあるけど、行の重複が発生すると
取得したデータの保持で、キー重複が発生して、アプリが落ちる可能性があるため
NOLOCKを使用する場合は注意が必要。

と、いっても対処方法はないので、問題がある場合は、
READ_COMMITTED_SNAPSHOT オプションをONにするか、NOLOCKを使わないか
しかなさそう。