2015年9月27日日曜日

SQLServer からリンクサーバーでつないだOracle に OpenQuery を発行 その2

SQLServer からリンクサーバーで ORACLE につなぐのは、結構みなさんやりたいようですね。

以前に書いた「SQLServer からリンクサーバーでつないだOracle に OpenQuery を発行」に結構アクセスをいただいています。

この時の例では、条件に数値を入れていますのであまり問題ないのですが、文字列を条件に入れる場合、クォーテーション「'」の数で悩むときがあります。

条件が数値の場合は、
SELECT * FROM OPENQUERY(OraLink, 'SELECT * FROM hoge Where ID = 1')
これでいいんですけど、

条件が文字の場合は、
SELECT * FROM OPENQUERY(OraLink,
               'SELECT * FROM hoge Where name like  ''hagehage%'' ')

ということになります。
SQLServer がクォーテーテョンを2個並べると1個分と判断するので、
実際にORACLE に投げられるSQL文は、
SELECT * FROM hoge Where name like  'hagehage%'
ということになります。

2015年9月11日金曜日

全角の濁点

今回ははまりました。

全角で「ゴ」などの濁る音は、1文字ですが、半角だど「コ」と「゛」の2文字です。
(ここでは、すべて全角で書いています。見づらいので、以下「゛」を「濁」とします。)

ところが、全角なのに「コ」と「濁」との2文字で入力してあるものが混じっていました。
多分これは昔に半角で入力してあったものを、関数等で全角に無理やり移植した残骸だと思います。

この文字列から、「濁」だけを除去したい、というか、
数字が混在している文字列から数字だけを抜き出す処理を作っていたので、「濁」も普通に除去できていると思っていましたが、「濁」が混じると、除去できてませんでした。

Select @aaa = Replace('123コ濁ウ','濁','')
普通に書いたこれでは除去できないいんです。

前から1文字ずつ取得して、文字列の長さ回数分ループで回して、
0~9以外が来れば除去するという処理を書いても除去できません。
('123コ濁ウ'をループさせた結果は「123コ濁」が返りました。)
この「濁」を照合するためには照合順序を変更しなければなりません。

Select @aaa = Replace('123コ゛ウ','濁','' COLLATE JAPANESE_BIN)

「COLLATE JAPANESE_BIN」でバイナリーで照合をしてくれるので、除去できます。

因みに指定しない場合(デフォルト)は
「Japanese_CI_AS」
です。
これは、大文字小文字、かな、全角半角を区別しないという意味です。