CAST および CONVERT (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

これらの関数は、あるデータ型の式を別のデータ型に変換します。

構文

-- CAST Syntax:  
CAST ( expression AS data_type [ ( length ) ] )  
  
-- CONVERT Syntax:  
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )  

トピック リンク アイコン Transact-SQL 構文表記規則

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

式 (expression)
任意の有効な

data_type
対象のデータ型です。 xmlbigintsql_variant が含まれます。 別名データ型は使用できません。

length
データ型でユーザー指定の長さが許可されるとき、ターゲット データ型の長さを指定する任意の整数。 既定値は 30 です。

style
CONVERT 関数で expression を変換する方法を指定する整数式です。 スタイル値が NULL の場合は、NULL が返されます。 data_type は範囲を決定します。

戻り値の型

data_type に変換された expression を返します。

日付および時刻のスタイル

date または time データ型の expression の場合、style には次の表に示すいずれかの値を指定できます。 その他の値は 0 として処理されます。 SQL Server 2012 (11.x) 以降では、date 型と time 型を datetimeoffset に変換するときにサポートされるスタイルは、0 または 1 のみです。 他のすべての変換スタイルでは 9809 が返されます。

注意

SQL Server は、クウェート アルゴリズムを使用して、アラビア スタイルで、日付の書式をサポートします。

2 桁の年 (yy) (1) 4 桁の年 (yyyy) Standard 入力/出力 (3)
- 0 または 100 (1、2) datetime および smalldatetime の既定値 mon dd yyyy hh:miAM (または PM)
1 101 米国 1 = mm/dd/yy
101 = mm/dd/yyyy
2 102 ANSI 2 = yy.mm.dd
102 = yyyy.mm.dd
3 103 イギリス/フランス 3 = dd/mm/yy
103 = dd/mm/yyyy
4 104 ドイツ語 4 = dd.mm.yy
104 = dd.mm.yyyy
5 105 イタリア語 5 = dd-mm-yy
105 = dd-mm-yyyy
6 106 (1) - 6 = dd mon yy
106 = dd mon yyyy
7 107 (1) - 7 = Mon dd, yy
107 = Mon dd, yyyy
8 または 24 108 - hh:mi:ss
- 9 または 109 (1、2) 既定値 + ミリ秒 mon dd yyyy hh:mi:ss:mmmAM (または PM)
"10" 110 米国 10 = mm-dd-yy
110 = mm-dd-yyyy
11 111 日本 11 = yy/mm/dd
111 = yyyy/mm/dd
12 112 ISO 12 = yymmdd
112 = yyyymmdd
- 13 または 113 (1、2) ヨーロッパの既定値 + ミリ秒 dd mon yyyy hh:mi:ss:mmm (24h)
14 114 - hh:mi:ss:mmm (24h)
- 20 または 120 (2) ODBC 標準 yyyy-mm-dd hh:mi:ss (24h)
- 21 または 25 または 121 (2) time、date、datetime2、および datetimeoffset の ODBC 標準 (ミリ秒を含む) の既定値 yyyy-mm-dd hh:mi:ss.mmm (24h)
22 - 米国 mm/dd/yy hh:mi:ss AM (または PM)
- 23 ISO8601 yyyy-mm-dd
- 126 (4) ISO8601 yyyy-mm-ddThh:mi:ss.mmm (スペースなし)

注: ミリ秒 (mmm) の値が 0 の場合、ミリ秒を表す小数部の値は表示されません。 たとえば、値 "2012-11-07T18:26:20.000" は、"2012-11-07T18:26:20"' と表示されます。
- 127(6、7) ISO 8601 (タイム ゾーン Z) yyyy-MM-ddThh:mm:ss.fffZ (スペースなし)

注: ミリ秒 (mmm) の値が 0 の場合、ミリ秒を示す小数部の値は表示されません。 たとえば、値 "2012-11-07T18:26:20.000" は、"2012-11-07T18:26:20" と表示されます。
- 130 (1、2) Hijri (5) dd mon yyyy hh:mi:ss:mmmAM

このスタイルでは、mon は月の正式名に関する複数トークンの Hijri (イスラム暦) ユニコード表現を表します。 この値は、SSMS の既定の米国用インストールでは正しく表示されません。
- 131 (2) Hijri (5) dd/mm/yyyy hh:mi:ss:mmmAM

1 これらのスタイル値で返される結果は非決定的です。 この場合は、すべての (yy) (2 桁の年) スタイルと、(yyyy) (4 桁の年) スタイルのサブセットが対象となります。

2 既定値 (0 または 1009 または 10913 または 11320 または 12023、および 21 または 25 または 121) は常に 4 桁の年 (yyyy) を返します。

3datetime に変換する場合は入力になり、文字データに変換する場合は出力になります。

4 XML で使用するよう設計されています。 datetime または smalldatetime から文字データに変換する場合の出力形式は、前の表に示したとおりです。

5 Hijri とはいくつかのバリエーションがあるカレンダー システムです。 SQL Server ではクウェート アルゴリズムが使用されます。

重要

SQL Server の既定では、2 桁の年は、終了年 2049 年を基準に解釈されます。 つまり、SQL Server は 2 桁の年 49 を 2049 年と解釈し、2 桁の年 50 を 1950 年と解釈します。 クライアント アプリケーションの中には、Automation オブジェクトに基づくものなど、2030 年を終了年とするものも多くあります。 SQL Server には、SQL Server によって使用される基準年を変更するための 2 桁年基準構成オプションが用意されています。 これにより、日付の一貫性のある処理を行うことができます。 年は 4 桁で指定することをお勧めします。

6 文字データを datetime または smalldatetime 型にキャストする場合のみサポートされます。 日付部分または時刻部分のみを表す文字データを、datetime または smalldatetime データ型にキャストするとき、時刻部分が指定されていないと 00:00:00.000 に設定され、日付部分が指定されていないと 1900-01-01 に設定されます。

7 タイム ゾーン インジケーター Z は省略可能です。これを使用すると、タイム ゾーン情報が含まれる XML の datetime 値から、タイム ゾーン情報が含まれない SQL Server datetime 値へのマップが容易になります。 Z は、タイム ゾーン UTC-0 を示します。 + または - 方向の HH:MM オフセットは、他のタイム ゾーンを示します。 (例: 2006-12-12T23:45:12-08:00)。

smalldatetime を文字データに変換する場合、秒またはミリ秒を含むスタイルではそれらの位置に 0 が表示されます。 datetime または smalldatetime の値から変換するときは、適切な char または varchar データ型の長さを使用して、日付の不要な部分を切り捨てます。

時刻を含むスタイルを使って文字データから datetimeoffset に変換すると、タイム ゾーン オフセットが結果に追加されます。

float 型スタイルと real 型スタイル

expressionfloat 型または real 型の場合、style は次の表に示すいずれかの値になります。 その他の値は 0 として処理されます。

出力
0 (既定値) 最高 6 桁。 該当する場合は、科学的表記法で使用します。
1 常に 8 桁。 常に科学的表記法で使用します。
2 常に 16 桁。 常に科学的表記法で使用します。
3 常に 17 桁。 ロスレス変換に使用します。 このスタイルでは、すべての浮動小数点数または実数が異なる文字列に変換されることが保証されます。

適用対象: SQL Server (SQL Server 2016 (13.x) 以降) と Azure SQL データベース。
126、128、129 レガシのために含まれていますが、将来のリリースではこれらの値は非推奨になる可能性があります。

money 型スタイルと smallmoney 型スタイル

expressionmoney 型または smallmoney 型の場合、style は次の表に示すいずれかの値になります。 その他の値は 0 として処理されます。

出力
0 (既定値) 小数点位置から左へ 3 桁ごとの位置にはコンマを挿入しません。また、小数点右側には 2 桁をとります。

例:4235.98
1 小数点位置から左へ 3 桁ごとの位置にはコンマを挿入します。また、小数点右側には 2 桁をとります。

例:3,510.92
2 小数点位置から左へ 3 桁ごとの位置にはコンマを挿入しません。また、小数点右側には 4 桁をとります。

例:4235.9819
126 char(n) または varchar(n) に変換する場合はスタイル 2 に相当します。

xml スタイル

expressionxml 型の場合、style は次の表に示すいずれかの値になります。 その他の値は 0 として処理されます。

出力
0 (既定値) 既定の解析動作を使用します。つまり、余分な空白を破棄し、内部の DTD サブセットを許可しません。

注: xml データ型への変換では、SQL Server での余分な空白は XML 1.0 とは別の方法で処理されます。 詳細については、「XML データのインスタンスの作成」を参照してください。
1 余分な空白を保持します。 このスタイル設定は、xml:space="preserve" の動作と一致するように、既定の xml:space の処理を設定します。
2 限定的な内部 DTD サブセット処理を有効にします。

有効な場合、サーバーでは内部 DTD サブセットで提供される情報を次のように使用して、検証を行わない解析操作を実行できます。

- 属性の既定値が適用されます
- 内部エンティティの参照が解決および展開されます
- DTD コンテンツ モデルの構文の正確さが確認されます

パーサーでは外部 DTD サブセットが無視されます。 また、XML 宣言を評価して、standalone 属性に yes または no の値が設定されているかどうかも確認しません。 代わりに、XML インスタンスをスタンドアロン ドキュメントとして解析します。
3 余分な空白を保持し、限定的な内部 DTD サブセット処理を有効にします。

バイナリ スタイル

expressionbinary(n)char(n)varbinary(n) 、または varchar(n) の場合、style は次の表に示すいずれかの値になります。 表に記載されていないスタイル値の場合は、エラーが返されます。

出力
0 (既定値) ASCII 文字をバイナリ バイトに変換するか、バイナリ バイトを ASCII 文字に変換します。 各文字またはバイトは 1:1 で変換されます。

バイナリの data_type の場合は、文字 0x が結果の左側に追加されます。
12 バイナリの data_type の場合は、式は文字式であることが必要です。 expression偶数 桁の 16 進数 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f) である必要があります。 style が 1 に設定されている場合、式の最初の 2 文字は 0x である必要があります。 式に奇数桁の文字が含まれているか、いずれかの文字が使用できない場合は、エラーが発生します。

変換された式の長さが data_type の長さを超える場合、結果の右側が切り捨てられます。

固定長の data_type が変換された結果より長い場合は、結果の右側に 0 が追加されます。

data_type が文字型の場合は、バイナリ式である必要があります。 各バイナリ文字は、2 桁の 16 進数の英数文字に変換されます。 変換された式の長さが data_type の長さを超えているとします。 その場合は切り捨てられます。

data_type が固定サイズの文字型で、変換された結果の長さが data_type の長さよりも短い場合、変換された式の右側に空白が追加され、偶数桁の 16 進数が維持されます。

style が 2 の場合、変換された結果の左側に文字 0x は追加されません。

暗黙的な変換

暗黙的な変換では、CAST 関数または CONVERT 関数を指定する必要はありません。 明示的な変換では、CAST 関数または CONVERT 関数を指定する必要があります。 次の図は、SQL Server システムで提供されるデータ型に対して許可されるすべての明示的および暗黙的なデータ型変換を示しています。 bigintsql_variantxml が含まれます。 代入時に sql_variant データ型からの暗黙的な変換は行われませんが、sql_variant への暗黙的な変換は行われます。

ヒント

このグラフは、Microsoft ダウンロード センターで PNG ファイルとしてダウンロードできます。

データ型変換テーブル

上のグラフは、SQL Server で許可されているすべての明示的および暗黙的な変換を示していますが、結果的に生成される変換のデータ型は実行される操作に依存します。

  • 明示的な変換の場合、ステートメント自体によって結果のデータ型が決定されます。
  • 暗黙的な変換の場合、変数の値の設定や列への値の挿入などの代入ステートメントは、変数宣言または列定義によって定義されたデータ型になります。
  • 比較演算子または他の式の場合、結果のデータ型は、データ型の優先順位の規則によって異なります。

ヒント

変換でデータ型の優先順位の影響については、このセクションの後半で実際の例を確認できます。

datetimeoffset と、charncharnvarchar、および varchar の各文字型との間で変換を行う場合、変換後のタイム ゾーン オフセットの部分は、HH と MM の両方が常に 2 桁である必要があります。 たとえば、-08:00 などです。

注意

Unicode データでは常に偶数のバイト数が使用されるので、binary 型または varbinary 型と、Unicode がサポートするデータ型との間でデータを変換する場合は注意してください。 たとえば、次のような変換を行うと、16 進数の 41 は返されません。 16 進数の値 4100 が返されます。SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary) 詳細については、「 Collation and Unicode Support」を参照してください。

大きな値のデータ型

大きな値のデータ型では、それより小さな値のデータ型、つまり nvarcharvarbinary、および varchar 型と同様の明示的および暗黙的な変換動作が行われます。 ただし、次のガイドラインを考慮してください。

  • image 型から varbinary(max) 型への変換およびその逆の変換は暗黙的な変換であり、text 型と varchar(max) 型の間、および ntext 型と nvarchar(max) 型の間の変換も暗黙的な変換です。
  • varchar(max) 型のような大きな値のデータ型から、varchar 型のような小さな値のデータ型への変換は暗黙的な変換ですが、大きな値のサイズが、小さなデータ型で指定された長さを超えると、切り捨てが発生します。
  • nvarcharvarbinary、または varchar 型から対応する大きな値のデータ型への変換は、暗黙的に行われます。
  • sql_variant 型から大きな値のデータ型への変換は明示的な変換です。
  • 大きな値のデータ型は、sql_variant 型へは変換できません。

xml データ型からの変換について詳しくは、「XML データのインスタンスの作成」をご覧ください。

xml データ型。

明示的か暗黙的かにかかわらず、xml データ型を文字列またはバイナリのデータ型にキャストするとき、xml データ型の内容は、定義されている一連のルールに基づいてシリアル化されます。 これらの規則については、「XML データのシリアル化の定義」を参照してください。 他のデータ型から xml データ型への変換については、「XML データのインスタンスの作成」をご覧ください。

text および image データ型

text および image データ型では、データ型の自動変換はサポートされていません。 text データは文字データに、image データは binary または varbinary 型に明示的に変換できますが、最大の長さは 8,000 バイトに制限されます。 文字を含む文字式を int 型に変換するなど、不適切な変換が試行された場合、SQL Server ではエラー メッセージが返されます。

出力の照合順序

CAST または CONVERT 関数が文字列を入出力する場合、出力では入力と同じ照合順序および照合順序ラベルが使用されます。 入力が文字列ではない場合、出力ではデータベースの既定の照合順序、および強制可能な既定照合順序の照合順序ラベルが使用されます。 詳細については、「照合順序の優先順位 (Transact-SQL)」を参照してください。

出力に別の照合順序を割り当てるには、CAST 関数または CONVERT 関数の結果式に COLLATE 句を適用します。 次に例を示します。

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

切り捨てと丸め処理の結果

文字式またはバイナリ式 (binarycharncharnvarcharvarbinary、または varchar) を異なるデータ型の式に変換するとき、変換操作により、出力データが切り捨てられたり、出力データの一部だけ表示されたり、エラーが返されたりする場合があります。 このようなことは、結果が小さすぎて表示できない場合に発生します。 binarycharncharnvarcharvarbinary、および varchar 型への変換では、次の表に示す変換を除き、切り捨てが行われます。

変換前のデータ型 変換後のデータ型 結果
intsmallint、または tinyint char *
varchar *
nchar E
nvarchar E
moneysmallmoneynumericdecimalfloat、または real char E
varchar E
nchar E
nvarchar E

* = 結果が短すぎて表示できません

E = 結果が短すぎて表示できない場合エラーが返される。

SQL Server では、元のデータから別のデータ型に変換し、再度元のデータ型に戻すラウンド トリップ変換の場合にだけ、異なるバージョンでも同じ結果が生成されることが保証されています。 次にラウンド トリップ変換の例を示します。

DECLARE @myval DECIMAL (5, 2);  
SET @myval = 193.57;  
SELECT CAST(CAST(@myval AS VARBINARY(20)) AS DECIMAL(10,5));  
-- Or, using CONVERT  
SELECT CONVERT(DECIMAL(10,5), CONVERT(VARBINARY(20), @myval));  

警告

binary 型の値を作成し、これを数値データ型に変換することは避けてください。 SQL Server では、decimal または numeric データ型の binary 型への変換が SQL Server のバージョン間で同じになることは保証されていません。

次の例では、短すぎて表示できない結果式を示します。

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.LastName, SUBSTRING(p.Title, 1, 25) AS Title,
    CAST(e.SickLeaveHours AS char(1)) AS [Sick Leave]  
FROM HumanResources.Employee e JOIN Person.Person p 
    ON e.BusinessEntityID = p.BusinessEntityID  
WHERE NOT e.BusinessEntityID > 5;  

結果セットは次のようになります。

FirstName   LastName      Title   Sick Leave
---------   ------------- ------- --------`
Ken         Sanchez       NULL   *
Terri       Duffy         NULL   *
Roberto     Tamburello    NULL   *
Rob         Walters       NULL   *
Gail        Erickson      Ms.    *

(5 row(s) affected)  

小数点の位置が異なるデータ型を変換すると、SQL Server により、切り捨てられた結果の値が返される場合と、丸められた値が返される場合があります。 次の表にその動作を示します。

ソース ターゲット 動作
numeric numeric Round
numeric int Truncate
numeric money Round
money int Round
money numeric Round
float int Truncate
float numeric Round

科学的表記法を使用した float 値から decimal または numeric への変換は、有効桁数 17 桁までの値に制限されます。 有効桁数が 17 より多い値はゼロに丸められます。
float datetime Round
datetime int Round

たとえば、値 10.6496 と -10.6496 を int または numeric 型に変換すると、切り捨てや丸め処理が行われる可能性があります。

SELECT  CAST(10.6496 AS INT) as trunc1,
        CAST(-10.6496 AS INT) as trunc2,
        CAST(10.6496 AS NUMERIC) as round1,
        CAST(-10.6496 AS NUMERIC) as round2;

クエリ結果を次の表に示します。

trunc1 trunc2 round1 round2
10 -10 11 -11

変換後のデータ型の小数点以下桁数が変換前のデータ型の小数点以下桁数より少ない場合は、値が丸められます。 たとえば、次の変換では $10.3497 が返されます。

SELECT CAST(10.3496847 AS money);

数値ではない charncharnvarcharvarchar データを、decimalfloatintnumeric に変換すると、SQL Server はエラー メッセージを返します。 また、SQL Server では、空の文字列 (" ") を numeric または decimal に変換してもエラーが返されます。

一部の datetime 変換が非決定的である

文字列から datetime への変換が非決定的であるスタイルは次のようになっています。

  • 100 未満のすべてのスタイル1
  • 106
  • 107
  • 109
  • 113
  • 130

1 スタイル 20 と 21 を除く

詳細については、「リテラル日付文字列を DATE 値に非決定論的に変換する」を参照してください。

補助文字 (サロゲート ペア)

SQL Server 2012 (11.x) 以降、補助文字 (SC) の照合順序を使用した場合は、nchar または nvarchar 型から nchar または nvarchar 型への CAST 操作を実行すると、サロゲート ペア内では切り捨てられません。 代わりに、補助文字の前で切り捨てが行われます。 たとえば次のコード フラグメントでは、@x'ab' だけが保持されます。 補助文字を保持するための十分な領域がありません。

DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);  
SELECT CAST (@x AS NVARCHAR(3));  

SC の照合順序を使用する場合、CONVERT の動作は CAST の動作と似たものとなります。 詳細については、「照合順序と Unicode のサポート」の「補助文字」セクションを参照してください。

互換性サポート

以前のバージョンの SQL Server では、time および datetime2 データ型に対する CAST および CONVERT 操作の既定のスタイルは、いずれかの型が計算列の式で使用されている場合を除き、121 です。 計算列の場合、既定のスタイルは 0 です。 この動作は、計算列が作成されるとき、自動パラメーター化を含むクエリで使用されるとき、または制約の定義で使用されるときに、計算列に影響を与えます。

互換性レベル 110 以上では、time および datetime2 データ型に対する CAST および CONVERT 操作は、既定のスタイルとして常に 121 になります。 クエリが古い動作に依存する場合は、110 より小さい互換性レベルを使用するか、または影響を受けるクエリで 0 スタイルを明示的に指定してください。

互換性レベル CAST と CONVERT の既定のスタイル1 計算列の既定のスタイル
< 110 121 0
> = 110 121 121

1 計算列を除く

データベースを互換性レベル 110 以上にアップグレードしても、ディスクに格納されているユーザー データは変更されません。 このようなデータは手動で適切に修正する必要があります。 たとえば、SELECT INTO を使用して、前に説明した計算列の式を含むソースからテーブルを作成した場合は、計算列の定義自体ではなく、(スタイル 0 を使用する) データが格納されます。 このようなデータは、手動で更新してスタイル 121 に一致させる必要があります。

使用例

A. CAST と CONVERT の両方を使用する

次の例では、表示価格の最初の桁が 3 である製品について製品名を取得し、その ListPriceint 型に変換します。

-- Use CAST  
USE AdventureWorks2012;  
GO  
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice  
FROM Production.Product  
WHERE CAST(ListPrice AS int) LIKE '33%';  
GO  
  
-- Use CONVERT.  
USE AdventureWorks2012;  
GO  
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice  
FROM Production.Product  
WHERE CONVERT(int, ListPrice) LIKE '33%';  
GO  

結果セットは次のようになります。 このサンプル結果セットは、CAST と CONVERT の両方で同じです。

ProductName                    ListPrice
------------------------------ ---------------------
LL Road Frame - Black, 58      337.22
LL Road Frame - Black, 60      337.22
LL Road Frame - Black, 62      337.22
LL Road Frame - Red, 44        337.22
LL Road Frame - Red, 48        337.22
LL Road Frame - Red, 52        337.22
LL Road Frame - Red, 58        337.22
LL Road Frame - Red, 60        337.22
LL Road Frame - Red, 62        337.22
LL Road Frame - Black, 44      337.22
LL Road Frame - Black, 48      337.22
LL Road Frame - Black, 52      337.22
Mountain-100 Black, 38         3374.99
Mountain-100 Black, 42         3374.99
Mountain-100 Black, 44         3374.99
Mountain-100 Black, 48         3374.99
HL Road Front Wheel            330.06
LL Touring Frame - Yellow, 62  333.42
LL Touring Frame - Blue, 50    333.42
LL Touring Frame - Blue, 54    333.42
LL Touring Frame - Blue, 58    333.42
LL Touring Frame - Blue, 62    333.42
LL Touring Frame - Yellow, 44  333.42
LL Touring Frame - Yellow, 50  333.42
LL Touring Frame - Yellow, 54  333.42
LL Touring Frame - Yellow, 58  333.42
LL Touring Frame - Blue, 44    333.42
HL Road Tire                   32.60

(28 rows affected)

B. CAST を算術演算子と共に使用する

この例では、今年のこれまでの売り上げ合計 (Computed) を手数料のパーセンテージ (SalesYTD) で割り、単一列の計算 (CommissionPCT) を行います。 この値は、最も近い整数に丸められた後、int データ型に CAST されます。

USE AdventureWorks2012;  
GO  
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS INT) AS Computed  
FROM Sales.SalesPerson   
WHERE CommissionPCT != 0;  
GO  

結果セットは次のようになります。

Computed
------
379753754
346698349
257144242
176493899
281101272
0  
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

(14 row(s) affected)  

C. CAST を使用して連結する

この例では、CAST を使用して文字型ではない式を連結します。 AdventureWorksDW データベースを使用します。

SELECT 'The list price is ' + CAST(ListPrice AS VARCHAR(12)) AS ListPrice  
FROM dbo.DimProduct  
WHERE ListPrice BETWEEN 350.00 AND 400.00;  

結果セットは次のようになります。

ListPrice
------------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09  

D. CAST を使用してテキストをさらに読みやすくする

この例では、SELECT リストの中で CAST を使用し、Name 列を char(10) 型の列に変換します。 AdventureWorksDW データベースを使用します。

SELECT DISTINCT CAST(EnglishProductName AS CHAR(10)) AS Name, ListPrice  
FROM dbo.DimProduct  
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';  

結果セットは次のようになります。

Name        ListPrice
----------  ---------
Long-Sleev  31.2437
Long-Sleev  32.4935
Long-Sleev  49.99  

E. CAST を LIKE 句と共に使用する

この例では、money 列の SalesYTD の値をデータ型 int に変換した後、データ型 char(20) に変換して、LIKE 句で使用できるようにします。

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID  
FROM Person.Person AS p   
JOIN Sales.SalesPerson AS s   
    ON p.BusinessEntityID = s.BusinessEntityID  
WHERE CAST(CAST(s.SalesYTD AS INT) AS char(20)) LIKE '2%';  
GO  

結果セットは次のようになります。

FirstName        LastName            SalesYTD         BusinessEntityID
---------------- ------------------- ---------------- -------------
Tsvi             Reiter              2811012.7151      279
Syed             Abbas               219088.8836       288
Rachel           Valdez              2241204.0424      289

(3 row(s) affected)  

F. CONVERT または CAST を、型指定された XML と共に使用する

これらの例では、XML データ型と列 (SQL Server) で CONVERT を使用し、型指定された XML への変換を行います。

次の例では、空白、テキスト、およびマークアップのある文字列を、型指定された XML に変換し、すべての余分な空白 (ノード間の境界の空白) を削除します。

SELECT CONVERT(XML, '<root><child/></root>')  

次の例では、空白、テキスト、およびマークアップのある同様の文字列を、型指定された XML に変換し、すべての余分な空白 (ノード間の境界の空白) を保持します。

SELECT CONVERT(XML, '<root>          <child/>         </root>', 1)  

次の例では、空白、テキスト、マークアップのある文字列を、型指定された XML にキャストします。

SELECT CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)  

他の例については、「XML データのインスタンスの作成」をご覧ください。

G. CAST および CONVERT を datetime データと共に使用する

GETDATE() の値以降、この例では、現在の日付と時刻を表示し、CAST を使用して現在の日付と時刻を文字列データ型に変更した後、CONVERT を使用して ISO 8601 形式で日付と時刻を表示します。

SELECT   
   GETDATE() AS UnconvertedDateTime,  
   CAST(GETDATE() AS NVARCHAR(30)) AS UsingCast,  
   CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;  
GO  

結果セットは次のようになります。

UnconvertedDateTime     UsingCast              UsingConvertTo_ISO8601
----------------------- ---------------------- ------------------------------
2006-04-18 09:58:04.570 Apr 18 2006  9:58AM    2006-04-18T09:58:04.570

(1 row(s) affected)  

この例は、前の例とほぼ逆になります。 この例では、日付と時刻を文字型データとして表示し、CAST を使用して文字型データを datetime データ型に変更します。さらに、CONVERT を使用して、文字型データを datetime データ型に変換します。

SELECT   
   '2006-04-25T15:50:59.997' AS UnconvertedText,  
   CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,  
   CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;  
GO  

結果セットは次のようになります。

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

(1 row(s) affected)  

H. CONVERT をバイナリ データおよび文字データと共に使用する

これらの例では、さまざまなスタイルを使用してバイナリ データと文字データを変換した結果を示します。

--Convert the binary value 0x4E616d65 to a character value.  
SELECT CONVERT(CHAR(8), 0x4E616d65, 0) AS [Style 0, binary to character];  

結果セットは次のようになります。

Style 0, binary to character
----------------------------
Name  

(1 row(s) affected)  

この例では、Style 1 が結果の切り捨てを強制できることを示します。 結果セット内の文字 0x は、切り捨てを強制します。

SELECT CONVERT(CHAR(8), 0x4E616d65, 1) AS [Style 1, binary to character];  

結果セットは次のようになります。

Style 1, binary to character
------------------------------
0x4E616D

(1 row(s) affected)  

この例は、結果に文字 0x が含まれていないため、Style 2 は結果を切り捨てないことを示しています。

SELECT CONVERT(CHAR(8), 0x4E616d65, 2) AS [Style 2, binary to character];  

結果セットは次のようになります。

Style 2, binary to character
------------------------------
4E616D65

(1 row(s) affected)  

文字値 'Name' をバイナリ値に変換します。

SELECT CONVERT(BINARY(8), 'Name', 0) AS [Style 0, character to binary];  

結果セットは次のようになります。

Style 0, character to binary
----------------------------
0x4E616D6500000000

(1 row(s) affected)  
SELECT CONVERT(BINARY(4), '0x4E616D65', 1) AS [Style 1, character to binary];  

結果セットは次のようになります。

Style 1, character to binary
---------------------------- 
0x4E616D65

(1 row(s) affected)  
SELECT CONVERT(BINARY(4), '4E616D65', 2) AS [Style 2, character to binary];  

結果セットは次のようになります。

Style 2, character to binary  
----------------------------------  
0x4E616D65

(1 row(s) affected)  

I. 日付と時刻のデータ型の変換

この例では、date、time、および datetime データ型の変換の例を示します。

DECLARE @d1 DATE, @t1 TIME, @dt1 DATETIME;  
SET @d1 = GETDATE();  
SET @t1 = GETDATE();  
SET @dt1 = GETDATE();  
SET @d1 = GETDATE();  
-- When converting date to datetime the minutes portion becomes zero.  
SELECT @d1 AS [DATE], CAST (@d1 AS DATETIME) AS [date as datetime];  
-- When converting time to datetime the date portion becomes zero   
-- which converts to January 1, 1900.  
SELECT @t1 AS [TIME], CAST (@t1 AS DATETIME) AS [time as datetime];  
-- When converting datetime to date or time non-applicable portion is dropped.  
SELECT @dt1 AS [DATETIME], CAST (@dt1 AS DATE) AS [datetime as date], 
   CAST (@dt1 AS TIME) AS [datetime as time];  

J. 異なる形式で CONVERT と datetime データを使用する

GETDATE() 値から、この例では CONVERT を使用し、この記事の「日付および時刻のスタイル」セクションのあらゆる日付スタイルと時刻スタイルを表示します。

形式番号 クエリの例 サンプルの結果
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) Aug 23 2019 1:39PM
1 SELECT CONVERT(NVARCHAR, GETDATE(), 1) 08/23/19
2 SELECT CONVERT(NVARCHAR, GETDATE(), 2) 19.08.23
3 SELECT CONVERT(NVARCHAR, GETDATE(), 3) 23/08/19
4 SELECT CONVERT(NVARCHAR, GETDATE(), 4) 23.08.19
5 SELECT CONVERT(NVARCHAR, GETDATE(), 5) 23-08-19
6 SELECT CONVERT(NVARCHAR, GETDATE(), 6) 23 Aug 19
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) Aug 23, 19
8 または 24 または 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 または 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) Aug 23 2019 1:39:17:090PM
10 SELECT CONVERT(NVARCHAR, GETDATE(), 10) 08-23-19
11 SELECT CONVERT(NVARCHAR, GETDATE(), 11) 19/08/23
12 SELECT CONVERT(NVARCHAR, GETDATE(), 12) 190823
13 または 113 SELECT CONVERT(NVARCHAR, GETDATE(), 13) 23 Aug 2019 13:39:17:090
14 または 114 SELECT CONVERT(NVARCHAR, GETDATE(), 14) 13:39:17:090
20 または 120 SELECT CONVERT(NVARCHAR, GETDATE(), 20) 2019-08-23 13:39:17
21 または 25 または 121 SELECT CONVERT(NVARCHAR, GETDATE(), 21) 2019-08-23 13:39:17.090
22 SELECT CONVERT(NVARCHAR, GETDATE(), 22) 08/23/19 1:39:17 PM
23 SELECT CONVERT(NVARCHAR, GETDATE(), 23) 2019-08-23
101 SELECT CONVERT(NVARCHAR, GETDATE(), 101) 08/23/2019
102 SELECT CONVERT(NVARCHAR, GETDATE(), 102) 2019.08.23
103 SELECT CONVERT(NVARCHAR, GETDATE(), 103) 23/08/2019
104 SELECT CONVERT(NVARCHAR, GETDATE(), 104) 23.08.2019
105 SELECT CONVERT(NVARCHAR, GETDATE(), 105) 23-08-2019
106 SELECT CONVERT(NVARCHAR, GETDATE(), 106) 23 Aug 2019
107 SELECT CONVERT(NVARCHAR, GETDATE(), 107) 2019 年 8 月 23 日
110 SELECT CONVERT(NVARCHAR, GETDATE(), 110) 08-23-2019
111 SELECT CONVERT(NVARCHAR, GETDATE(), 111) 2019/08/23
112 SELECT CONVERT(NVARCHAR, GETDATE(), 112) 20190823
113 SELECT CONVERT(NVARCHAR, GETDATE(), 113) 23 Aug 2019 13:39:17.090
120 SELECT CONVERT(NVARCHAR, GETDATE(), 120) 2019-08-23 13:39:17
121 SELECT CONVERT(NVARCHAR, GETDATE(), 121) 2019-08-23 13:39:17.090
126 SELECT CONVERT(NVARCHAR, GETDATE(), 126) 2019-08-23T13:39:17.090
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.090
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ذو الحجة 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 22/12/1440 1:39:17.090PM

K. 許可される変換におけるデータ型の優先順位の影響

次の例では型 VARCHAR の変数が定義され、整数値が変数に代入された後、文字列型の変数の連結が選択されます。

DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.' AS Result

結果セットは次のようになります。

Result
-----------------------
1 is a string.

int 値 1 は VARCHAR に変換されました。

次の例では、同様のクエリで代わりに int 変数を利用しています。

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.' AS Result

ここでは、SELECT ステートメントからは次のエラーがスローされます。

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.

@notastring + ' is not a string.' を評価するために、SQL Server では、式の結果を計算する前に、データ型の優先順位の規則に従って暗黙的な変換を完了する必要があります。 int は VARCHAR よりも優先順位が高いため、SQL Server では文字列の整数への変換が試行され、その文字列を整数に変換できないため失敗します。

変換可能な文字列を指定する場合、ステートメントが成功します。次に例を示します。

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'

この場合、文字列 '1' を整数値 1 に変換できるため、この SELECT ステートメントからは値 2 が返されます。 指定されたデータ型が整数である場合、+ 演算子は文字列連結ではなく加算演算子になります。

例: Azure Synapse Analytics、Parallel Data Warehouse

L. CAST と CONVERT を使用する

次の各例では、表示価格の最初の桁が 3 である製品について製品名を取得し、これらの製品の ListPriceint 型に変換します。AdventureWorksDW2016 データベースを使用します。

SELECT EnglishProductName AS ProductName, ListPrice  
FROM dbo.DimProduct  
WHERE CAST(ListPrice AS int) LIKE '3%';  

CAST ではなく CONVERT を使用した同じクエリの例を次に示します。 AdventureWorksDW2016 データベースを使用します。

SELECT EnglishProductName AS ProductName, ListPrice  
FROM dbo.DimProduct  
WHERE CONVERT(INT, ListPrice) LIKE '3%';  

M. CAST を算術演算子と共に使用する

この例では、製品単価 (UnitPrice) を割引率 (UnitPriceDiscountPct) で割り、単一列の値を計算します。 この結果は、最も近い整数に丸められ、最終的に int データ型に変換されます。 この例では、AdventureWorksDW2016 データベースを使用します。

SELECT ProductKey, UnitPrice,UnitPriceDiscountPct,  
       CAST(ROUND (UnitPrice*UnitPriceDiscountPct,0) AS int) AS DiscountPrice  
FROM dbo.FactResellerSales  
WHERE SalesOrderNumber = 'SO47355'   
      AND UnitPriceDiscountPct > .02;  

結果セットは次のようになります。

ProductKey  UnitPrice  UnitPriceDiscountPct  DiscountPrice
----------  ---------  --------------------  -------------
323         430.6445   0.05                  22
213         18.5043    0.05                  1
456         37.4950    0.10                  4
456         37.4950    0.10                  4
216         18.5043    0.05                  1  

北 CAST を LIKE 句と共に使用する

この例では、moneyListPriceint 型に変換して、次に LIKE 句と共に使用できるよう char(20) 列に変換します。 この例では、AdventureWorksDW2016 データベースを使用します。

SELECT EnglishProductName AS Name, ListPrice  
FROM dbo.DimProduct  
WHERE CAST(CAST(ListPrice AS INT) AS CHAR(20)) LIKE '2%';  

O. CAST および CONVERT を datetime データと共に使用する

この例では、現在の日付と時刻を表示し、CAST を使用して現在の日付と時刻を文字列データ型に変更した後、最終的に CONVERT を使用して ISO 8601 形式で日付と時刻を表示します。 この例では、AdventureWorksDW2016 データベースを使用します。

SELECT TOP(1)  
   SYSDATETIME() AS UnconvertedDateTime,  
   CAST(SYSDATETIME() AS NVARCHAR(30)) AS UsingCast,  
   CONVERT(NVARCHAR(30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601  
FROM dbo.DimCustomer;  

結果セットは次のようになります。

UnconvertedDateTime     UsingCast                     UsingConvertTo_ISO8601  
---------------------   ---------------------------   ---------------------------  
07/20/2010 1:44:31 PM   2010-07-20 13:44:31.5879025   2010-07-20T13:44:31.5879025  

この例は、前の例とほぼ逆になります。 この例では、日付と時刻を文字型データとして表示し、CAST を使用して文字型データを datetime データ型に変更します。さらに、CONVERT を使用して、文字型データを datetime データ型に変換します。 この例では、AdventureWorksDW2016 データベースを使用します。

SELECT TOP(1)   
   '2010-07-25T13:50:38.544' AS UnconvertedText,  
CAST('2010-07-25T13:50:38.544' AS DATETIME) AS UsingCast,  
   CONVERT(DATETIME, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601  
FROM dbo.DimCustomer;  

結果セットは次のようになります。

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM   07/25/2010 1:50:38 PM  

関連項目

データ型の優先順位 (Transact-SQL)
データ型の変換 (データベース エンジン)
FORMAT (Transact-SQL)
STR (Transact-SQL)
SELECT (Transact-SQL)
システム関数 (Transact-SQL)
照合順序と Unicode のサポート
国際化に対応した Transact-SQL ステートメントの記述