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

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

  • あるオブジェクトのデータを他のオブジェクトのデータに移動、比較、または結合する場合は、あるオブジェクトのデータ型から他のオブジェクトのデータ型へ変換が必要な場合があります。

  • Transact-SQL 結果列、リターン コード、または出力パラメーターのデータをプログラム変数に移動する場合は、SQL Server のシステム データ型から変数のデータ型にデータを変換する必要があります。

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

  • 暗黙的な変換はユーザーが意識する必要はありません。

    SQL Server がデータのデータ型を自動的に変換します。たとえば、smallint 型を int 型と比較する場合、比較を実行する前に、smallint 型から int 型に暗黙的に変換されます。クエリ オプティマイザーでは、クエリ プランを生成してこの変換をいつでも実行できます。その結果、精度の低下、数値以外の文字列の数への変換などの変換エラーが実行時に発生する場合があります。詳細については、「クエリ式に関するエラーと警告のトラブルシューティング」を参照してください。

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

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

    CAST ( $157.27 AS VARCHAR(10) )
    

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

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

sql_variant 型を処理する場合、SQL Server は他のデータ型のオブジェクトから sql_variant 型への暗黙的な変換をサポートします。しかし、SQL Server では、sql_variant 型のデータから他のデータ型のオブジェクトへの暗黙的な変換はサポートされません。

SQL Server オブジェクト間でサポートされる変換の詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。

アプリケーション変数と SQL Server の結果セット列、リターン コード、パラメーター、またはパラメーター マーカーの間でデータ型を変換する場合、サポートされるデータ型変換はデータベース API によって決まります。詳細については、「プログラム変数へのデータの移動」を参照してください。

データ型変換の動作

このトピックの次のセクションでは、以下のデータ型変換の動作について説明します。

binary 型データと varbinary 型データ

money 型データ

bit 型データ

decimal 型データと numeric 型データ

文字データ

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

日付型と時刻型のデータ

整数型データ

float 型データと real 型データ

binary 型データと varbinary 型データの変換

データが文字列データ型 (char、varchar、nchar、nvarchar、binary、varbinary、text、ntext、または image) からデータ長の異なる binary データ型または varbinary データ型に変換される場合、SQL Server によりデータの右側の桁が埋め込まれるか、切り捨てられます。他のデータ型から binary 型または varbinary 型に変換する場合は、データの左側の桁が埋め込まれるか、切り捨てられます。桁の埋め込みには 16 進数の 0 が使用されます。

binary 型のデータは移動が容易なので、データを binary 型や varbinary 型に変換すると便利です。データがどのような型や値であっても、その値を十分な大きさのバイナリ値に変換し、その後元の型に変換すると、両方の変換が同じバージョンの SQL Server で実行された場合は、常に元の値に戻ります。値の 2 進表現は、SQL Server のバージョン間で異なる場合があります。

int、smallint、および tinyint を binary または varbinary に変換することはできますが、binary 型の値を再度 integer 型の値に戻した場合、切り捨てが行われていると、この値は最初の integer の値とは同じになりません。たとえば、次の SELECT ステートメントは整数値 123456 を通常はバイナリ値 0x0001e240 として格納することを示しています。

SELECT CAST( 123456 AS BINARY(4) )

ただし、次の SELECT ステートメントは、変換先の binary 型が小さすぎて値全体を保持できない場合は、左側の桁が暗黙的に切り捨てられ、同じ数値が 0xe240 として格納されることを示します。

SELECT CAST( 123456 AS BINARY(2) )

次のバッチは、暗黙的な切り捨てが算術演算に影響を与えることがあり、その場合でもエラーが生成されないことを示します。

DECLARE @BinaryVariable2 BINARY(2)

SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1

SELECT CAST( @BinaryVariable2 AS INT)
GO

最終的な値は 123457 ではなく 57921 になります。

注意

他のデータ型と binary 型との変換は、どのバージョンの SQL Server でも同じになるという保証はありません。

bit 型データの変換

bit 型に変換すると、0 以外の値はすべて 1 になります。

文字データの変換

文字式を異なるサイズの文字型に変換する場合、値が新しいデータ型にとって長すぎるときは、切り捨てられます。uniqueidentifier 型は、文字式からの変換のための文字型と見なされるため、文字型に変換する場合は切り捨てルールが適用されます。詳細については、「uniqueidentifier (Transact-SQL)」を参照してください。

文字式がデータ型やサイズが異なる文字式に変換される場合 (char(5) から varchar(5) や、char(20) から char(15) など)、入力値の照合順序が変換後の値に割り当てられます。文字式でない式が文字型に変換される場合、現在のデータベースの既定の照合順序が変換後の値に割り当てられます。どちらの場合でも、COLLATE 句を使用して特定の照合を割り当てることができます。

注意

コード ページ変換は char 型と varchar 型ではサポートされていますが、text 型ではサポートされていません。以前のバージョンの SQL Server と同様に、コード ページ変換中のデータの喪失は報告されません。

文字式を numeric 型の概算値に変換する場合、その文字式は指数表記を含むことができます。指数表記とは、小文字の e または大文字の E の後に必要に応じてプラス記号 (+) またはマイナス記号 (-) を付け、その後に数字を付けた表記です。

文字式を正確な numeric 型に変換する場合、その文字式は、数字と小数点から構成されている必要があります。必要に応じて、プラス記号 (+) またはマイナス記号 (-) を付けることができます。先頭の空白は無視されます。123,456.00 の桁区切り記号のようにコンマを区切り記号として文字列内で使用することはできません。

文字式を money 型または smallmoney 型に変換する場合、その文字式も、小数点とドル記号 ($) を含むことができます。$123,456.00 のようにコンマを区切り記号として使用できます。

次の例では、データを表示用に変換する方法を示しています。ここでは、文字列比較を実行する前に売上高データを文字データに変換し、現在日付をスタイル 3 の dd/mm/yy に変換します。

USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID,
   CAST(SalesYTD AS varchar(12)),
   CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%';
GO

次の例では、uniqueidentifier 型の値を char 型の値に変換します。

DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char';
GO

次の例では、現在日付をスタイル 3 の dd/mm/yy に変換します。

SELECT CONVERT(char(12), GETDATE(), 3);
GO

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

date 型と time 型に変換する場合、SQL Server で日付や時刻と認識できない値はすべて拒否されます。Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻の関数 (Transact-SQL)」を参照してください。

次の例は、date 型と datetime2 型の値を varchar 型と binary 型の値にそれぞれ変換します。

DECLARE @mydate date;
SET @mydate = '4/05/98';

SELECT CAST(@mydate AS varchar) AS DATE_VARCHAR;
GO

DECLARE @mydate  datetime2;
SET @mydate     = '4/05/98';

SELECT  CAST(@mydate AS binary) AS DATE_BINARY;
GO

以下に結果セットを示します。

(1 row(s) affected)

DATE_VARCHAR

------------------------------

Apr 5 1998

(1 row(s) affected)

DATE_BINARY

--------------------------------------------------------------

0x0700000000008B210B

(1 row(s) affected)

float 型データと real 型データの変換

float 型の値を整数型に変換すると切り捨てられます。

float 型または real 型から文字データへの変換を行う場合は、STR 文字列関数を使用する方が CAST( ) よりも便利です。これは、STR 関数の方がより柔軟に形式を制御できるためです。詳細については、「STR (Transact-SQL)」および「組み込み関数 (Transact-SQL)」を参照してください。

money 型データの変換

整数型を money 型に変換する場合、単位は金額であると仮定されます。たとえば、整数値の 4 は、4 通貨単位に相当する money 型の値に変換されます。

次の例は、smallmoney 型と money 型の値を varchar 型と decimal 型の値にそれぞれ変換します。

USE AdventureWorks2008R2;
GO
DECLARE @mymoney_sm smallmoney;
SET  @mymoney_sm = 3148.29;
SELECT  CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney    money;
SET  @mymoney    = 3148.29;
SELECT  CAST(@mymoney AS decimal)    AS 'MONEY DECIMAL';

GO

以下に結果セットを示します。

SM_MONEY VARCHAR

------------------------------

3148.29

(1 row(s) affected)

MONEY DECIMAL

----------------------

3148

(1 row(s) affected)

decimal 型データと numeric 型データの変換

SQL Server では、decimal 型と numeric 型の場合、有効桁数と小数点以下桁数の組み合わせが異なる場合は、異なるデータ型と見なされます。たとえば、decimal(5,5) と decimal(5,0) は異なるデータ型と見なされます。

Transact-SQL ステートメントでは、小数点の付いた定数は、必要最小限の有効桁数と小数点以下桁数で自動的に numeric 型の値に変換されます。たとえば、定数 12.345 は有効桁数が 5、小数点以下桁数が 3 の numeric 型に変換されます。

decimal 型または numeric 型から float 型または real 型に変換する場合、有効桁数がある程度失われる場合があります。int、smallint、tinyint、float、real、money、または smallmoney を decimal または numeric のいずれかに変換すると、オーバーフローが発生する場合があります。

SQL Server では、既定で、数値を decimal 型または numeric 型の値に変換する場合、有効桁数と小数点以下桁数が少なくなって丸められます。ただし、SET ARITHABORT オプションが ON に設定されている場合は、オーバーフローが起こると SQL Server はエラーを生成します。有効桁数と小数点以下桁数が失われただけではエラーは生成されません。

整数型データの変換

整数を暗黙的に文字データ型に変換するとき、整数が大きすぎて文字型フィールドに格納できない場合、ASCII 文字コード 42 のアスタリスク (*) が SQL Server によって入力されます。

2,147,483,647 を超える整数は、bigint データ型ではなく、decimal データ型に変換されます。次の例では、int 値がしきい値を超えた場合に、変換結果が decimal 型に変わります。

SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2 ;

以下に結果セットを示します。

Result1 Result2

1073741823 1073741824.500000

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

SQL Server は Transact-SQL のデータ型を使用し、OLE オートメーションは Visual Basic のデータ型を使用するので、OLE オートメーション ストアド プロシージャでは両方の間で渡されるデータの型を変換する必要があります。

次の表は、SQL Server データ型から Visual Basic データ型への変換を示します。

SQL Server データ型

Visual Basic データ型

char, varchar, text, nvarchar, ntext

String

decimal, numeric

String

bit

Boolean

binary, varbinary, image

1 次元 Byte() 配列

int

Long

smallint

Integer

tinyint

Byte

float

Double

real

Single

money, smallmoney

Currency

datetime, smalldatetime

Date

上記以外は NULL に設定

Variant は Null に設定

binary、varbinary、および image の各型の値を除いて、1 つの SQL Server 値は 1 つの Visual Basic 値に変換されます。これらの値は Visual Basic の 1 次元 Byte() 配列に変換されます。この配列の範囲は Byte(0 ~ length1) です。length は SQL Server の binary 型、varbinary 型、または image 型の各値のバイト数です。

次の表は、Visual Basic データ型から SQL Server データ型への変換を示しています。

Visual Basic データ型

SQL Server データ型

Long, Integer, Byte, Boolean, Object

int

Double,Single

float

Currency

money

Date

datetime

4,000 文字以下の String

varchar/nvarchar

4,000 文字を超える String

text/ntext

8,000 バイト以下の 1 次元 Byte() 配列

varbinary

8,000 バイトを超える 1 次元 Byte() 配列

image