CAST および CONVERT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

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

構文

CAST 構文:

CAST ( expression AS data_type [ ( length ) ] )

CONVERT 構文:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Transact-SQL 構文表記規則

引数

式 (expression)

任意の有効な式。

data_type

対象のデータ型です。 xml、bigint、sql_variant が含まれます。 別名データ型は使用できません。

長さ

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

スタイル

CONVERT関数がどのように表現を平行移動するかを指定する整数式です。 スタイル値が NULLの場合、 NULL が返されます。 data_type は範囲を決定します。

戻り値の型

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

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

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

注

SQL Server データベース エンジンはクウェートアルゴリズムでアラビア風の日付形式をサポートしています。

2 桁の年 (yy) 1 4 桁の年 (yyyy) Standard 入力/出力 3
- 0または 1001,2 datetime および smalldatetime の既定値 MMM dd yyyy hh:mmtt (tt は AM か 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 MMM yy
106 = dd MMM yyyy
7 107 1 - 7 = MMM dd, yy
107 = MMM dd, yyyy
8 または 24 108 - HH:mm:ss
- 9または 1091,2 既定値 + ミリ秒 MMM dd yyyy hh:mm:ss:ffftt (tt は AM か PMか)
10 110 米国 10 = MM-dd-yy
110 = MM-dd-yyyy
11 111 Japan 11 = yy/MM/dd
111 = yyyy/MM/dd
12 112 ISO 12 = yyMMdd
112 = yyyyMMdd
- 13または 1131,2 ヨーロッパの既定値 + ミリ秒 dd MMM yyyy HH:mm:ss:fff (24 時間)
14 114 - HH:mm:ss:fff (24 時間)
- 20または1202 ODBC 標準 yyyy-MM-dd HH:mm:ss (24 時間)
- 21または25や1212 time、date、datetime2、および datetimeoffset の ODBC 標準 (ミリ秒を含む) の既定値 yyyy-MM-dd HH:mm:ss.fff (24 時間)
22 - 米国 MM/dd/yy hh:mm:ss tt (tt は AM か PMか)
- 23 ISO8601 yyyy-MM-dd
- 126 4 ISO8601 yyyy-MM-ddTHH:mm:ss.fff (スペースなし) 6
- 127 8, 9 ISO 8601 (タイム ゾーン Z) yyyy-MM-ddTHH:mm:ss.fffZ (スペースなし) 6
- 130 1,2 イスラム暦 5 dd MMMM yyyy hh:mm:ss:ffftt 7
- 131 2 イスラム暦 5 dd/MM/yyyy hh:mm:ss:ffftt

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

2 デフォルト値(0 または 100、 9 または 109、 13 または 113、 20 または 120、 23、 21 または 25 または 121)は常に世紀(yyyy)を返します。

重要

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

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

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

5 Hijri とはいくつかのバリエーションがあるカレンダー システムです。 データベース エンジンはクウェートのアルゴリズムを使用しています。

6 ミリ秒 (fff) の値が 0 の場合、ミリ秒を表す小数部の値は表示されません。 たとえば、値 2022-11-07T18:26:20.000 は 2022-11-07T18:26:20 として表示されます。

7 このスタイルでは、 MMMM は月名のマルチトークン Hijri Unicode 表現を表します。 この値は、SSMS の既定の米国用インストールでは正しく表示されません。

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

9 オプションのタイムゾーンインジケーターZを使い、タイムゾーン情報を含むXMLのdatetime値をタイムゾーンのないデータベース エンジン datetime値にマッピングしやすくします。 Z は、タイム ゾーン UTC-0 を示します。 HH:mm または + 方向の - オフセットは、他のタイム ゾーンを示します。 (例: 2022-12-12T23:45:12-08:00)。

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

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

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

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

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

適用対象: SQL Server 2016 (13.x) 以降のバージョン、および Azure SQL Database。
126、128、129 互換上の理由で含まれています。 これらの値は、新しい開発には使用しないでください。

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

expression が money 型または 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 スタイル

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

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

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

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

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

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

バイナリ スタイル

binary(n)の場合、 char(n)、varbinary(n)、または varchar(n)expression, style 次の表に示す値のいずれかを指定できます。 テーブルに記載されていないスタイル値はエラーを返します。

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

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

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

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

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

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

0x文字はスタイルのために変換された結果の左側に追加されません2。

暗黙的な変換

暗黙的な変換では、CAST 関数または CONVERT 関数を指定する必要はありません。 明示的な変換では、CAST 関数または CONVERT 関数を指定する必要があります。 以下の図は、データベース エンジンシステム提供のデータ型で許可されているすべての明示的および暗黙のデータ型変換を示しています。 これには bigint、 sql_variant、 xml、 hierarchyid、 地理、 幾何学、 json、 ベクターが含まれます。 jsonおよびベクターデータ型は、SQL Server 2025(17.x)、Azure SQL Database、Azure SQL Managed Instance、およびMicrosoft FabricのSQLデータベースでのみ利用可能です。 sql_variantデータ型からの割り当てに対する暗黙の変換はありませんが、sql_variantへの暗黙の変換は存在します。

SQL Serverデータ型間の変換が明示的、暗黙的、または禁止されていることを示す図で、階層型、地理型、ジオメトリ型、json型、ベクター型が含まれます。

上記の図は、データベース エンジンで許可されているすべての明示的および暗黙的変換を示していますが、変換の結果として得られるデータ型は実行される操作によって異なります。

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

一部のデータ型では、そのデータ型の宣言方法によって結果が異なります。

  • 10進法と数値:データベース エンジンは精度とスケールの組み合わせをそれぞれ異なるデータ型として扱います。 両者間の交差は暗黙のうちに行われることもあります。 目標スケールより小数点以下の桁が多い値は誤りなく丸められます。 目標精度に対して値が大きすぎると誤差8115が生じます。ただし、 ARITHABORT と ANSI_WARNINGS が両方とも OFFしない限り、結果は NULL となります。
  • varchar(max)、nvarchar(max)、varbinary(max)をsql_variantに変換することはできません。
  • 異なるCLRユーザー定義タイプ間の変換は許可されていません。
  • 型なしXMLと型付きXML間、また同じXMLスキーマコレクションと同じDOCUMENTまたはCONTENT面を使う型付きXML値間での暗黙変換がサポートされています。
  • 異なるXMLスキーマコレクション間の変換や、異なる DOCUMENT と CONTENT 面間の変換は明示的でなければなりません。 CLRユーザー定義型と型付き XML の変換は許可されていません。
  • ベクトル値の変換は、寸法とベース型(float32またはfloat16)が同じである場合にのみ許可されます。

チャートで許可されている変換でも、有効なJSONでない文字列や異なる次元数のベクトルなど、特定の値は失敗する可能性があります。 画像、nテキスト、テキスト、xml、地理、幾何学、json、ベクターのデータ型の値は、同じデータ型であっても等価(=)演算子と比較できません。

ヒント

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

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

ncharとnvarcharのデータ型は、UnicodeデータをUTF-16エンコーディングで保存し、常に偶数バイトを使用します。 二進法やヴァルビナリをncharやnvarcharに変換する際は注意してください。 例えば、以下の変換では16進数の値 41は返されません。 16進数の値が 4100を返します。

SELECT CAST (CAST (0x41 AS NVARCHAR) AS VARBINARY);

詳細については、「照合順序および Unicode のサポート」を参照してください。

大きな値のデータ型

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

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

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

xml データ型。

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

text および image データ型

text および image データ型では、データ型の自動変換はサポートされていません。 text データは文字データに、image データは binary または varbinary 型に明示的に変換できますが、最大の長さは 8,000 バイトに制限されます。 例えば文字を含む文字式をintに変換しようとすると、データベース エンジンはエラーメッセージを返します。

出力の照合順序

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

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

SELECT CAST ('abc' AS VARCHAR (5)) COLLATE French_CS_AS;

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

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

変換前のデータ型 変換後のデータ型 結果
int、smallint、または tinyint 焦がす
varchar
短すぎて表示されません
nchar
nvarchar
エラー 1
money、smallmoney、numeric、decimal、float、または real 焦がす
varchar
エラー 1
nchar
nvarchar
エラー 1

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

SQL Server データベース エンジンは、元のデータ型からデータ型を変換して再び変換する往復変換のみが、バージョン間で同じ値を得られることを保証しています。 次にラウンド トリップ変換の例を示します。

DECLARE @myval AS 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));
GO

警告

binary 型の値を作成し、これを数値データ型に変換することは避けてください。 データベース エンジンは、10進または数値のデータ型をバイナリに変換した結果が、SQL Serverのバージョン間で同じであることを保証するわけではありません。

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

USE AdventureWorks2025;
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 AS e
     INNER JOIN Person.Person AS p
         ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID > 5;
GO

結果セットは次のとおりです。

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

小数点差で異なるデータ型を変換すると、データベース エンジンは時に切り詰められた結果値を返し、また別の時には丸めた値を返します。 次の表にその動作を示します。

ソース ターゲット 動作
数値 数値 丸い
数値 int 切り詰める
数値 お金 丸い
お金 int 丸い
お金 数値 丸い
浮く int 切り詰める
浮く 数値 ラウンド 1
浮く datetime 丸い
datetime int 丸い

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

例えば、値10.6496と-10.6496は、 int 型や 数値 型への変換時に切り詰められたり丸められたりすることがあります。

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);

データベース エンジンは、非数値のchar、nchar、nvarchar、varcharのデータを10進数、float、int、数値に変換するとエラーメッセージを返します。 空文字列( )を数値または小数に変換すると、データベース エンジンはエラーを返します。

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

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

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

120 および 21

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

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

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

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

SELECT CAST (@x AS NVARCHAR (3));

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

互換性サポート

以前のバージョンの SQL Server では、時間および日付時間2のデータ型に対するCASTおよびCONVERT操作のデフォルトスタイルは121ですが、計算された列式でどちらかの型が使われている場合は例外です。 計算された列の場合、デフォルトのスタイルは 0です。 この挙動は、計算された列が作成される際、自動パラメータ化に関わるクエリで使用される場合、または制約定義で使われる際に影響を及ぼします。

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

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

1 計算列を除く

データベースを互換性レベル 110 以上にアップグレードしても、ディスクに保存されたユーザーデータは変わりません。 このようなデータは手動で適切に修正する必要があります。 例えば、上記の計算された列式を含むソースから SELECT INTO を使った場合、計算された列定義ではなく、スタイル 0を使ったデータ自体が保存されます。 このデータはスタイル 121に合わせて手動で更新する必要があります。

例

この記事のコードサンプルは、AdventureWorks2025、AdventureWorksDW2025、またはAdventureWorksLT2025サンプルデータベースを使用しており、Azure Data SQL Samples Repository GitHubリポジトリからダウンロードできます。

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

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

CAST を使用して次のことを行います。

USE AdventureWorks2025;
GO

SELECT SUBSTRING(Name, 1, 30) AS ProductName,
       ListPrice
FROM Production.Product
WHERE CAST (ListPrice AS INT) LIKE '33%';
GO

CONVERT を使用して次のことを行います。

USE AdventureWorks2025;
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

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

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

USE AdventureWorks2025;
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

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

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

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)列に変換しています。 AdventureWorksDW2025 データベースを使用します。

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

結果セットは次のとおりです。

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

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

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

USE AdventureWorks2025;
GO

SELECT p.FirstName,
       p.LastName,
       s.SalesYTD,
       s.BusinessEntityID
FROM Person.Person AS p
     INNER 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

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

これらの例は、XMLデータ型と列(SQL Server)を用いてデータを型付きXMLに変換するCONVERTの利用を示しています。

次の例では、空白、テキスト、およびマークアップのある文字列を、型指定された 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
----------------------- ---------------------- ------------------------------
2022-04-18 09:58:04.570 Apr 18 2022  9:58AM    2022-04-18T09:58:04.570

この例は、前の例とほぼ逆になります。 この例では、日付と時刻を文字型データとして表示し、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

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 が結果の短縮を強制できることを示しています。 結果集合に 0x 組み込まれた文字が切断を強制します。

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

結果セットは次のとおりです。

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

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

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

結果セットは次のとおりです。

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

文字の値を Name 値に変換します。

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

結果セットは次のとおりです。

Style 0, character to binary
----------------------------
0x4E616D6500000000
SELECT CONVERT (BINARY (4), '0x4E616D65', 1) AS [Style 1, character to binary];

結果セットは次のとおりです。

Style 1, character to binary
----------------------------
0x4E616D65
SELECT CONVERT (BINARY (4), '4E616D65', 2) AS [Style 2, character to binary];

結果セットは次のとおりです。

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

一 日付と時刻のデータ型を変換する

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

DECLARE @d1 AS DATE,
        @t1 AS TIME,
        @dt1 AS 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];

date から datetime または datetime2 への変換を検討する場合は、値が互換性のある範囲内にあることを確認します。 datetime の最も小さい年の値は 1753 です。0001 と datetime2 の最も小さい年の値は です。

DECLARE @d1 AS DATE,
        @dt1 AS DATETIME,
        @dt2 AS DATETIME2;

SET @d1 = '1492-08-03';
--This is okay; Minimum YYYY for DATE is 0001

SET @dt2 = CAST (@d1 AS DATETIME2);
--This is okay; Minimum YYYY for DATETIME2 IS 0001

SET @dt1 = CAST (@d1 AS DATETIME);
--This returns an error with (Msg 242) "The conversion of a date data type to a datetime data type resulted in an out-of-range value."
--Minimum YYYY for DATETIME is 1753

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

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

形式番号 クエリの例 サンプルの結果
0 SELECT CONVERT(NVARCHAR, GETDATE(), 0) 2019 年 8 月 23 日午後 1:39
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) 8 月 23 日
7 SELECT CONVERT(NVARCHAR, GETDATE(), 7) 8 月 23 日、19 日
8 または 24 または 108 SELECT CONVERT(NVARCHAR, GETDATE(), 8) 13:39:17
9 または 109 SELECT CONVERT(NVARCHAR, GETDATE(), 9) 2019 年 8 月 23 日 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) 2019 年 8 月 23 日 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
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) 2019 年 8 月 23 日
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) 2019 年 8 月 23 日 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.09
127 SELECT CONVERT(NVARCHAR, GETDATE(), 127) 2019-08-23T13:39:17.09
130 SELECT CONVERT(NVARCHAR, GETDATE(), 130) 22 ذو الحجة 1440 1:39:17.090P
131 SELECT CONVERT(NVARCHAR, GETDATE(), 131) 1440年12月22日 1:39:17.090PM

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

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

DECLARE @string AS VARCHAR (10);
SET @string = 1;

SELECT @string + ' is a string.' AS Result;

結果セットは次のとおりです。

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

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

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

DECLARE @notastring AS 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.'を評価するために、データベース エンジンはデータ型の優先順位のルールに従い、暗黙の変換を完了してから式の結果を計算する必要があります。 intはvarcharよりも優先順位が高いため、データベース エンジンは文字列を整数に変換しようとしますが、この文字列が整数に変換できないため失敗します。

変換可能な文字列を用意すると、次の例のように文は成功します。

DECLARE @notastring AS INT;
SET @notastring = '1';

SELECT @notastring + '1';

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

例: Azure Synapse Analytics

L. CAST および CONVERT を使用する

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

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

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

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

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

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

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 句と共に使用する

この例では 、お金 の列 ListPrice を int 型に変換し、さらに char(20) 型に変換することで、 LIKE その条件を使えるようにしています。 この例では、AdventureWorksDW2025 データベースを使用します。

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 形式で日付と時刻を表示します。 この例では、AdventureWorksDW2025 データベースを使用します。

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 データ型に変換します。 この例では、AdventureWorksDW2025 データベースを使用します。

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