データ型の変換 (データベース エンジン)

適用対象:yesSQL Server (サポートされているすべてのバージョン) Yes Azure SQL Database Yes azure SQL Managed Instance yes azure Synapse analytics yes analytics Platform System (PDW)

データ型は、以下のシナリオで変換される場合があります。

  • あるオブジェクトのデータを他のオブジェクトのデータに移動、比較、または結合する場合は、あるオブジェクトのデータ型から他のオブジェクトのデータ型への変換が必要な場合があります。
  • SQL transact-sql の結果列、リターンコード、または出力パラメーターのデータをプログラム変数に移動する場合は、データを SQL Server システムデータ型から変数のデータ型に変換する必要があります。

アプリケーション変数と SQL Server 結果セット列、リターンコード、パラメーター、またはパラメーターマーカーの間で変換を行う場合、サポートされるデータ型変換はデータベース API によって定義されます。

暗黙的な変換と明示的な変換

データ型は、暗黙的または明示的に変換できます。

暗黙的な変換はユーザーが意識する必要はありません。 SQL Server は、データをあるデータ型から別のデータ型に自動的に変換します。 たとえば、smallint 型を int 型と比較する場合、比較を実行する前に、smallint 型から int 型に暗黙的に変換されます。

GETDATE() は、暗黙的に日付スタイル 0 に変換します。 SYSDATETIME() は、暗黙的に日付スタイル 21 に変換します。

明示的な変換では、CAST 関数または CONVERT 関数を使用します。

CAST と CONVERT の各関数は、値 (ローカル変数、列、または他の式) のデータ型を変換します。 たとえば、次の CAST 関数は数値 $157.27 を文字列 '157.27' に変換します。

CAST ( $157.27 AS VARCHAR(10) )  

SQL プログラムコードを ISO に準拠させる場合は、CONVERT ではなく CAST を使用します。 CONVERT のスタイル機能を利用する場合は、CAST ではなく CONVERT を使用します。

次の図は、SQL Server システムによって提供されるデータ型に対して許可されているすべての明示的および暗黙的なデータ型変換を示しています。 xmlbigintsql_variant が含まれます。 代入時に sql_variant データ型からの暗黙的な変換は行われませんが、sql_variant への暗黙的な変換は行われます。

Data type conversion table

上のグラフは、SQL Server で許可されているすべての明示的および暗黙的な変換を示していますが、変換の結果のデータ型を示すものではありません。 SQL Server で明示的な変換が実行されると、ステートメント自体によって結果のデータ型が決定されます。 暗黙的な変換の場合、変数の値の設定や列への値の挿入などの代入ステートメントは、変数宣言または列定義によって定義されたデータ型になります。 比較演算子または他の式の場合、結果のデータ型は、データ型の優先順位の規則によって異なります。

例として、次のスクリプトでは型 varchar の変数が定義され、int 型の値が変数に代入された後、文字列型の変数の連結が選択されます。

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

1int 値は varchar に変換されるため、SELECT ステートメントからは値 1 is a string. が返されます。

次の例は、代わりに int 変数を使用した同様のスクリプトを示しています。

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

この場合、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 では、式の結果を計算する前に、データ型の優先順位の規則に従って暗黙的な変換を完了します。 intvarchar よりも優先順位が高いため、SQL Server では文字列の整数への変換が試行され、その文字列を整数に変換できないため失敗します。 式に変換可能な文字列が指定されている場合は、ステートメントが成功します。次に例を示します。

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

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

データ型変換の動作

ある SQL Server オブジェクトのデータ型を別のオブジェクトに変換する場合、暗黙的なデータ型変換と明示的なデータ型変換はサポートされません。 たとえば、nchar 型の値を image 型の値に変換することはできません。 nchar は明示的な変換によってのみ binary に変換できます。binary への暗黙的な変換はサポートされません。 ただし、nchar は暗黙的、明示的のどちらでも nvarchar に変換できます。

次のトピックでは、対応するデータ型によって実行される変換の動作について説明します。

OLE オートメーション ストアド プロシージャを使用したデータ型の変換

SQL Server では transact-sql データ型 SQL が使用され、ole オートメーションでは Visual Basic データ型が使用されるため、ole オートメーションストアドプロシージャでは、これらのデータ型の間でやり取りされるデータを変換する必要があります。

次の表では、データ型変換を Visual Basic SQL Server について説明します。

SQL Server のデータ型 Visual Basic のデータ型
charvarchartextnvarcharntext String
decimalnumeric String
bit Boolean
binaryvarbinaryimage 1 次元 Byte() 配列
int Long
smallint 整数
tinyint Byte
float Double
real Single
moneysmallmoney 通貨
datetimesmalldatetime 日付
上記以外は NULL に設定 null 値に設定された Variant

すべての単一 SQL Server 値は、 binaryvarbinaryimageの値を除き、1つの Visual Basic 値に変換されます。 これらの値は、Visual Basic の1次元Byte ()配列に変換されます。 この配列の範囲はByte ( 0 からlength 1 * *) * * です。 lengthは、SQL Server binaryvarbinary、またはimage値のバイト数です。

これらは、Visual Basic データ型から SQL Server データ型への変換です。

Visual Basic のデータ型 SQL Server のデータ型
LongIntegerByteBooleanObject int
DoubleSingle float
通貨 money
日付 datetime
4,000 文字以下の String VarcharNvarchar
4,000 文字を超える String テキストNtext
8,000 バイト以下の 1 次元 Byte() 配列 varbinary
8,000 バイトを超える 1 次元 Byte() 配列 image

関連項目

OLE オートメーション ストアド プロシージャ (Transact-SQL)
CAST および CONVERT (Transact-SQL)
データ型 (Transact-SQL)
COLLATE (Transact-SQL)