sql >> データベース >  >> RDS >> Sqlserver

SQLServerのデータ型の優先順位

    以下は、SQLServerのデータ型を優先順に含むリストです。

    1. ユーザー定義のデータ型(最高)
    2. sql_variant
    3. xml
    4. datetimeoffset
    5. datetime2
    6. datetime
    7. smalldatetime
    8. date
    9. time
    10. float
    11. real
    12. decimal
    13. money
    14. smallmoney
    15. bigint
    16. int
    17. smallint
    18. tinyint
    19. bit
    20. ntext
    21. text
    22. image
    23. timestamp
    24. uniqueidentifier
    25. nvarcharnvarchar(max)を含む )
    26. nchar
    27. varcharvarchar(max)を含む )
    28. char
    29. varbinaryvarbinary(max)を含む )
    30. 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

    ただし、この場合、+ 演算子は、文字列連結演算子ではなく、加算数学演算子になります。


    1. DLL「kernel32.dll」で「InterlockedIncrement」という名前のエントリポイントが見つかりません-[メール保護]64ビット

    2. MariaDBでのQUOTE()のしくみ

    3. PSQLスクリプト(bashスクリプトから供給)の変数として外部XMLファイルにアクセスする

    4. データベースセキュリティ101:オープンソースデータベースのセキュリティ