以下は、SQLServerのデータ型を優先順に含むリストです。
- ユーザー定義のデータ型(最高)
-
sql_variant
-
xml
-
datetimeoffset
-
datetime2
-
datetime
-
smalldatetime
date
time
float
real
decimal
money
-
smallmoney
-
bigint
-
int
-
smallint
-
tinyint
bit
-
ntext
text
image
timestamp
uniqueidentifier
-
nvarchar
(nvarchar(max)
を含む ) -
nchar
-
varchar
(varchar(max)
を含む ) -
char
-
varbinary
(varbinary(max)
を含む ) binary
(最低)
演算子を使用して異なるデータ型のオペランドを組み合わせると、優先順位の低いデータ型が最初に優先順位の高いデータ型に変換されます。
変換がサポートされている暗黙の変換でない場合、エラーが返されます。
両方のオペランドが同じタイプの場合、変換は行われず(または必要ありません)、演算の結果はオペランドのデータ型を使用します。
例
成功する暗黙の変換の例を次に示します。
SELECT 1 * 1.00;
結果:
1.00
ここで、左のオペランドは右のオペランドのデータ型に変換されました。
より明確な方法は次のとおりです。
DECLARE
@n1 INT,
@n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1 * @n2;
結果:
1.00
この場合、左側のオペランドをINT
として明示的に宣言しました。 右のオペランドはDECIMAL(5, 2)
です。 。
sys.dm_exec_describe_first_result_set
を使用して結果をさらに調べることができます システム動的管理機能。
この関数を使用すると、クエリで返された各列のデータ型を確認できます。
SELECT
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
'DECLARE @n1 INT, @n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1, @n2, @n1 * @n2;',
null,
0);
結果:
+--------------------+--------------+-------------+---------+ | system_type_name | max_length | precision | scale | |--------------------+--------------+-------------+---------| | int | 4 | 10 | 0 | | decimal(5,2) | 5 | 5 | 2 | | decimal(16,2) | 9 | 16 | 2 | +--------------------+--------------+-------------+---------+
ここでは、各行がクエリによって返された各列を表していることがわかります。したがって、最初の列はINT
でした 、2番目の列はDECIMAL(5,2)
でした 、および3番目の列は DECIMAL(16,2)
。
したがって、SQLServerは実際にDECIMAL(16,2)
を返しました。 、元の10進値が DECIMAL(5,2)
であったとしても 。
変換エラーの例
前述のように、変換がサポートされている暗黙的な変換でない場合は、エラーが返されます:
SELECT 'Age: ' + 10;
結果:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Age: ' to data type int.
この場合、文字列を連結しようとしていました(VARCHAR
)と数値(INT
)。 INT
として表示 VARCHAR
よりも優先順位が高い 、SQLServerは文字列をINT
に暗黙的に変換しようとしました 。
この文字列は整数に変換できないため、これは失敗しました。
これを克服するために、最初にINT
を変換できます VARCHAR
へ :
SELECT 'Age: ' + CAST(10 AS VARCHAR(2));
結果:
Age: 10
これで、両方のオペランドのデータ型が同じになるため、SQL Serverは、暗黙的な変換を実行しなくても操作を正常に実行できます。
この特定の操作を行う別の方法は、CONCAT()
を使用することです。 機能:
SELECT CONCAT('Age: ', 10);
結果:
Age: 10
CONCAT()
functionは文字列関数であるため、連結前にすべての引数を文字列型に暗黙的に変換します。したがって、明示的な変換を実行する必要はありませんでした。
ただし、文字列オペランドを暗黙的に数値に変換できる場合は、+
を使用してもエラーは発生しません。 演算子:
SELECT '10' + 10;
結果:
20
ただし、この場合、+
演算子は、文字列連結演算子ではなく、加算数学演算子になります。