データ型を操作する

完了

Transact-SQL で使用される列と変数には、それぞれ "データ型" があります。 式の値の動作は、参照される列または変数のデータ型によって異なります。 たとえば、前に説明したとおり、+ 演算子を使用して、2 つの文字列値を連結したり、2 つの数値を追加したりすることができます。

次の表は、SQL Server データベースでサポートされている一般的なデータ型を示しています。

真数

概数

文字

日付/時刻

Binary

その他

tinyint

float

char

date

binary

カーソル (cursor)

smallint

real

varchar

time

varbinary

hierarchyid

INT

text

DATETIME

image

sql_variant

bigint

nchar

datetime2

table

bit

nvarchar

smalldatetime

timestamp

decimal/numeric

ntext

datetimeoffset

UNIQUEIDENTIFIER

numeric

xml

money

geography

smallmoney

geometry

Note

さまざまなデータ型とその属性の詳細については、「Transact-SQL のリファレンス ドキュメント」を参照してください。

データ型の変換

互換性のあるデータ型の値は、必要に応じて暗黙的に変換できます。 たとえば、+ 演算子を使用すると、"+" を "10 進数" に追加するか、または固定長の char 値と可変長の varchar 値を連結することができます。 ただし、場合によっては、値をあるデータ型から別のデータ型に明示的に変換することが必要になります。たとえば、+ を使用して varchar 値と decimal 値を連結しようとすると、最初に数値を互換性のある文字列データ型に変換しない限り、エラーが発生します。

注意

暗黙的および明示的な変換は特定のデータ型に適用され、一部の変換は不可能です。 詳細については、「Transact-SQL のリファレンス ドキュメント」のグラフを使用してください。

T-SQL には、データ型間の明示的な変換に役立つ関数が含まれています

CAST と TRY_CAST

値がターゲットのデータ型と互換性がある場合、CAST 関数は値を指定されたデータ型に変換します。 互換性がない場合は、エラーが返されます。

たとえば、次のクエリは CAST を使用して、ProductID 列の "整数" 値を varchar 値 (最大 4 文字) に変換して、それらを別の文字ベースの値と連結します。

SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;

このクエリの結果は次のようになります。

ProductName

680: HL Road Frame - Black, 58

706: HL Road Frame - Red, 58

707: Sport-100 Helmet, Red

708: Sport-100 Helmet, Black

...

ただし、Production.Product テーブルの Size 列が nvarchar (可変長、Unicode テキスト データ) 列であり、いくつかの数値のサイズ (たとえば、58) といくつかのテキストベースのサイズ ("S"、"M"、"L" など) が含まれるとしましょう。 次のクエリでは、この列の値を "整数" データ型に変換することを試みます。

SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;

このクエリにより、次のエラーメッセージが発生します。

エラー: nvarchar の値 'M' をデータ型 int に変換中に、変換に失敗しました。

列の値の少なくとも "一部" が数値である場合、それらの値を変換して他の値を無視することができます。 TRY_CAST 関数を使用すると、データ型を変換できます。

SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;

今回の結果は次のようになります。

NumericSize

58

58

NULL

NULL

...

数値データ型に変換できる値は "10 進数" 値として返され、互換性のない値は NULL として返され、これは、値が "不明" であることを示します。

注意

NULL 値を処理する際の考慮事項については、このユニットで後ほど説明します。

CONVERT と TRY_CONVERT

CAST は、データ型間で変換するための ANSI 標準 SQL 関数であり、多くのデータベース システムで使用されています。 Transact-SQL では、次に示すように、CONVERT 関数を使用することもできます。

SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;

この場合も、このクエリは、次のように、指定されたデータ型に変換された値を返します。

ProductName

680: HL Road Frame - Black, 58

706: HL Road Frame - Red, 58

707: Sport-100 Helmet, Red

708: Sport-100 Helmet, Black

...

CAST と同様に、CONVERT には、互換性のない値について NULL を返す TRY_CONVERT バリアントがあります。

CAST よりも CONVERT を使用するもう 1 つの利点は、CONVERT には、数値と日付の値を文字列に変換するときにスタイルの書式設定を指定できるパラメーターも含まれていることです。 たとえば、次のクエリを考えてみましょう。

SELECT SellStartDate,
       CONVERT(varchar(20), SellStartDate) AS StartDate,
       CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate 
FROM SalesLT.Product;

このクエリの結果は次のようになります。

SellStartDate

StartDate

FormattedStartDate

2002-06-01T00:00:00

Jun 1 2002 12:00AM

6/1/2002

2002-06-01T00:00:00

Jun 1 2002 12:00AM

6/1/2002

2005-07-01T00:00:00

Jul 1 2005 12:00AM

7/1/2005

2005-07-01T00:00:00

Jul 1 2005 12:00AM

7/1/2005

...

...

...

Note

CONVERT で使用できる "スタイル書式設定" コードの詳細については、「Transact-SQL のリファレンス ドキュメント」を参照してください。

PARSE と TRY_PARSE

PARSE 関数は、数値または日付/時刻の値を表す書式設定された文字列を変換するように設計されています。 たとえば、次のクエリについて考えてみましょう (これは、テーブルの列の値ではなくリテラル値を使用しています)。

SELECT PARSE('01/01/2021' AS date) AS DateValue,
   PARSE('$199.99' AS money) AS MoneyValue;

このクエリの結果は次のようになります。

DateValue

MoneyValue

2021-01-01T00:00:00

199.99

CAST および CONVERT と同様に、PARSE には、互換性のない値を NULL として返す TRY_PARSE バリアントがあります。

注意

10 進データ型または数値データ型を使用する場合は、整数に丸めるか、小数点を設定する必要があります。これは、有効桁数と小数点以下桁数で実現できます。 有効桁数と小数点以下桁数のこの概念をより深く理解するには、「Transact-SQL のリファレンス ドキュメント」を参照してください。

STR

STR 関数は、数値を varchar に変換します。

次に例を示します。

SELECT ProductID,  '$' + STR(ListPrice) AS Price
FROM Production.Product;

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

ProductID

Price

680

$1432.00

706

$1432.00

707

$35.00

...

...