SQL Serverでは、CASTとCONVERT関数を用いて明示的な型変換が可能です。両者は基本的な変換機能を共に持つものの、CONVERTは日付・時刻や数値の書式指定(styleパラメータ)に対応しており、CASTにはこの機能はありません。
CASTはANSI SQL標準に準拠しているため、移植性を重視する場合に適しています。一方、CONVERTはMicrosoft SQL Server特有の拡張であり、特に日付フォーマット制御が必要な場面で柔軟性が高いです。
構文比較
CONVERT(データ型[(長さ)], 式[, スタイル])CAST(式 AS データ型[(長さ)])
パラメータ説明:
データ型:bigint、sql_variantなど、システム提供型のみ許可。ユーザー定義型は使用不可。長さ:文字列系(char、varchar、nchar、nvarchar)およびバイナリ系(binary、varbinary)型でのみオプション指定可能。スタイル:日付/時刻または数値を文字列へ変換する際の書式コード(例:103→dd/mm/yyyy、120→yyyy-mm-dd hh:mi:ss)。
基本的な変換例
-- 数値演算と文字列連結の挙動
SELECT 1 + 2 AS result_number; -- 3(数値加算)
SELECT '1' + '2' AS result_concat; -- '12'(文字列結合)
SELECT 'abc' + CAST(456 AS VARCHAR(10)) AS combined; -- 'abc456'
-- 型変換の具体例
SELECT CONVERT(VARCHAR(12), 3.14159) AS pi_text;
SELECT CONVERT(VARCHAR(10), GETDATE(), 126) AS iso_date; -- ISO 8601形式(yyyy-mm-ddThh:mi:ss.mmm)
SELECT CAST('2024-05-20' AS DATE) AS parsed_date;
SELECT CAST(GETDATE() AS VARCHAR(19)); -- 暗黙的書式(例:'May 20 2024 3:45PM')
代表的な日付スタイルコード
| スタイル値 | 出力例(2024-05-20 15:45:30.123) | 説明 |
|---|---|---|
| 101 | 05/20/2024 | US(MM/dd/yyyy) |
| 103 | 20/05/2024 | UK(dd/mm/yyyy) |
| 112 | 20240520 | ISO(yyyymmdd) |
| 120 | 2024-05-20 15:45:30 | ODBC標準(yyyy-mm-dd hh:mi:ss) |
| 127 | 2024-05-20T15:45:30.123 | ISO 8601(タイムゾーンなし) |
文字列操作補足関数
SELECT UPPER('hello world') AS uppercase; -- 'HELLO WORLD'
SELECT LOWER('SQL SERVER') AS lowercase; -- 'sql server'
SELECT LEFT('Database', 4) AS prefix; -- 'Data'
SELECT LEN('Example') AS length; -- 7
SELECT SUBSTRING('Programming', 4, 5) AS slice; -- 'gramm'(位置4から5文字)
非推奨型の移行対応(例:image → varbinary)
image型はSQL Server 2005以降非推奨であり、VARBINARY(MAX)への置換が推奨されます。以下は安全な移行手順の一例:
-- 1. 新規列追加
ALTER TABLE Documents ADD SignatureBinary VARBINARY(MAX);
-- 2. データ移行(NULL許容を考慮)
UPDATE Documents
SET SignatureBinary = CAST(SignatureImage AS VARBINARY(MAX))
WHERE SignatureImage IS NOT NULL;
-- 3. 古い列削除(トランザクション内で実行推奨)
ALTER TABLE Documents DROP COLUMN SignatureImage;
-- 4. 新列名を整合的に変更(必要に応じて)
EXEC sp_rename 'Documents.SignatureBinary', 'Signature', 'COLUMN';