Oracleの関数をSQL Serverで使う
2009年3月追記:
- SQL ServerでOracleのTO_CHARを使うイメージはTransact-SQLの関数を理解しよう(変換関数)に書いています
- 他のOracle関数で似た結果を出力させる例は関数の組み合わせに書いています。
- SQL Server Migration Assistant for Oracle(SSMA)の最新バージョンは3.1です
- →SQL Server案件で、Oracle互換となるユーザ関数を使いたい場合に使用できます。
2010年1月追記:
マイコミジャーナルの記事「Transact-SQLの関数を理解しよう」のインデックスです
- 文字列編
- 取り出し、検索、置換(LEFT,RIGHT,SUBSTRING,REPLACE等)
- 繰り返し、変換、空白除去(REPLICATE,LOWER,UPPER,SPACE,LTRIM等)
- 長さの取得、文字コード等(LEN,DATALENGTH,ASCII,CHAR,UNICODE,NCHAR等)
- 日付数学編
- 日時妥当性、現在日時(ISDATE,GETDATE,CURRENT_TIMESTAMP,GETUTCDATE等)
- 日付時刻の取り出し、計算(YEAR,MONTH,DAY,DATENAME,DATEPART,DATEADD,DATEDIFF)
- 数値妥当性、四捨五入、切り捨て(ISNUMERIC,ROUND,CEILING,FLOOR)
- 数学、算術系関数(RAND,ABS,SIGN,LOG,PI,SIN,COS,TAN等)
- NULLと型変換編
- NULL値の関数、CASE関数(ISNULL,COALESCE,NULLIF,CASE) NVL的なもの
- 変換関数(CAST,CONVERT) TO_CHAR,TO_DATE的なもの
- 関数の組み合わせ LEFTB,RIGHTB,LPAD,RPAD,TRUNC,LAST_DAY的なもの
最近はSQL Serverを使っていますが、日付型を文字列に変換するT-SQLのConvert関数(MSDN)がなかなか覚えられないので、Oracleの時に使っていたTO_CHAR関数みたいなコードがないか探してみました。ココとか、ココとか、ココとか、似たようなコード等はあったのですが、ちょっとずつ機能不足な感じでした。自分で書こうかと思ったのですが、SQL Server Migration Assistant(SSMA)のことを思い出したので、インストールしてみました。
SSMAは、Oracle(8〜10g)からSQL Server(2000〜2005)へデーターベースを移行するためのマイグレーションツールで、Microsoftから無償でダウンロードできます。SSMAのダウンロードファイル「SSMAV2-JA.zip」は次の2つから構成されます。
- SSMA-Setup-2.0.0.420.exe
- SSMAExtPack-2.0.0.420.exe
- Oracleプログラムを動かすための拡張機能。
- セットアップ時にインストール先のSQL Serverを指定すると、「sysdb」というデータベースが作られ、Oracle互換用のテーブル、ビュー、プロシージャ、関数が登録される。
2番目の「SSMAExtPack-2.0.0.420.exe」をインストールすると、「sysdb」データベースの[プログラミング]-[関数]-[スカラ値関数]に、TO_CHAR、TO_DATE、LPAD、TRANC互換の関数が作成されますので、参考にすることができると思います。
SSMA関数の使い方の例としては次のような感じになります(言いかえれば、これに準ずるSQL Serverの組み込み関数は用意されていないということです)。
--■日付型から文字型へ変換[TO_CHAR] SELECT ssma.TO_CHAR_DATE(getdate(),'yyyymmdd') -->20080512 SELECT ssma.TO_CHAR_DATE(getdate(),'YYYY/MM/DD(DY) HH24:MI:SS〜') -->2008/05/12(月曜日) 22:38:35〜 --■文字型から日付型へ変換[TO_DATE] SELECT ssma.TO_DATE2('2008/01/31 13:30','YYYY/MM/DD HH24:MI') -->2008-01-31 13:30:00.000の日付型 --■数字型から文字型へ変換[TO_CHAR] -- 文字書式(コンマ、ピリオド、'0'(必ず表示)、'9'(あれば表示)をサポート、桁あふれ時は#) SELECT ssma.TO_CHAR_NUMERIC(12345,'9,999,990.0') -->12,345.0 --■左詰め[LPAD] -- 帳票のブランク埋めで良く使われる -- バイト数埋め(文字数のLPAD_nvarcharもある) SELECT ssma.LPAD_varchar('abc',10,' ') --> abc(左に7個の半角スペースが付加) --■右詰め[RPAD] --文字数埋め(バイト数のRPAD_varcharもある) SELECT ssma.RPAD_nvarchar('abc',10,'あ') -->abcあああああああ --■少数点、日付時刻の切り捨て[TRUNC] -- 四捨五入は標準関数のROUNDを使う。切り上げは無し SELECT ssma.TRUNC(123.456,2) --少数点2桁で切捨て -->123.45 SELECT ssma.TRUNC_DATE(getdate()) --時刻を切り捨て -->2008-05-12 00:00:00.000 --■月末日を取得 -- 時刻は現在時刻 SELECT ssma.LAST_DAY(getdate()) -->2008-05-31 22:24:03.187
その他、Oracleとの差異を吸収するためのプロシージャ(UTL_FILE_〜)や関数が用意されていますが、スカラ値関数の仕組み上「〜2」や「〜_型名」といった複数の関数に分かれていたりするので、使いにくい時もあるかもしれません。個人的には、SQL Serverの組み込み関数に慣れているので、上に書いた関数があれば十分な感じです。
ちなみに、MSDNのこのページによれば、ssma.やdbo.のようなスカラ値関数のスキーマ名は省略できないようです。