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

T-SQLを使用してSQLServerでユーザー定義のデータ型エイリアスを作成する方法

    SQL Serverで使用可能な多くのデータ型に加えて、独自のデータ型を作成するオプションもあります。これらの一部は「ユーザー定義データ型」と呼ばれ、その他は「エイリアスデータ型」と呼ばれます。

    ユーザー定義のデータ型 Microsoft.NET Framework共通言語ランタイム(CLR)のアセンブリのクラスを介して実装されます。

    エイリアスデータ型 SQLServerのネイティブシステムタイプに基づいています。つまり、エイリアスデータ型の基礎として既存のデータ型を使用します。

    そうは言っても、Microsoftがエイリアスデータ型を指すときに「ユーザー定義データ型エイリアス」という用語を使用しているのを見てきました。また、単に「データ型エイリアス」と呼ばれることもあります。

    いずれにせよ、この記事では、Transact-SQLを使用してユーザー定義のデータ型エイリアスを作成する方法を示します。

    例1-エイリアスデータ型を作成する

    エイリアスデータ型を作成するには、CREATE TYPEを実行します エイリアスデータ型を作成するデータベースに対するステートメント。

    これは、SQLServerのvarcharに基づいてユーザー定義のデータ型エイリアスを作成するコード例です。 データ型:

    USE Test;
    
    CREATE TYPE clientcode  
    FROM varchar(8) NOT NULL;
    

    結果:

    Commands completed successfully.
    Total execution time: 00:00:00.028
    

    この場合、 clientcodeというエイリアスデータ型を作成します Test というデータベース内 。

    私のエイリアスはvarchar(8)に基づいています 、これは、最大8バイトの長さの可変長文字列である可能性があることを意味します。シングルバイトエンコーディング文字セット(ラテン語など)の場合、これは最大8文字を格納します。ただし、マルチバイトエンコーディングの文字セットの場合、文字数が少なくなる可能性があります。

    例2–エイリアスデータ型を表示する

    sys.typesを使用できます エイリアスデータ型の詳細を確認するには:

    SELECT * FROM sys.types
    WHERE name = 'clientcode';
    

    結果:

    name              | clientcode
    system_type_id    | 167
    user_type_id      | 257
    schema_id         | 1
    principal_id      | NULL
    max_length        | 8
    precision         | 0
    scale             | 0
    collation_name    | SQL_Latin1_General_CP1_CI_AS
    is_nullable       | 0
    is_user_defined   | 1
    is_assembly_type  | 0
    default_object_id | 0
    rule_object_id    | 0
    is_table_type     | 0
    

    is_user_defined であることがわかります このデータ型のフラグは 1 です。 、つまり、ユーザー定義のデータ型です。

    この例では、結果を clientcode だけに絞り込みました。 データ・タイプ。 sys.typesを使用できます データベース内のすべてのデータ型に関する情報を返します。詳細については、SQLServerでデータ型のリストを返す方法を参照してください。

    エイリアスデータ型が作成されたので、先に進んでそれを使用できます。

    例3–エイリアスを使用するテーブルを作成する

    この例では、列定義の1つで新しく作成したデータ型エイリアスを使用するテーブルを作成します。

    USE Test;
    
    CREATE TABLE Client
    (
        ClientCode clientcode PRIMARY KEY,
        FirstName varchar(50),
        LastName varchar(50)
    );
    

    表の列を簡単に確認できます:

    SELECT 
      c.name,  
      c.system_type_id,
      c.user_type_id,
      c.max_length,
      c.is_nullable
    FROM sys.columns c
    INNER JOIN sys.tables t
    ON t.object_id = c.object_id
    WHERE t.name = 'Client';
    
    >

    結果:

    +------------+------------------+----------------+--------------+---------------+
    | name       | system_type_id   | user_type_id   | max_length   | is_nullable   |
    |------------+------------------+----------------+--------------+---------------|
    | ClientCode | 167              | 257            | 8            | 0             |
    | FirstName  | 167              | 167            | 50           | 1             |
    | LastName   | 167              | 167            | 50           | 1             |
    +------------+------------------+----------------+--------------+---------------+
    

    データの列は他にもたくさんありますが、この記事に関連するものだけに絞り込みました。

    例4–データの挿入

    次に、ユーザー定義のデータ型エイリアスを使用する列にデータを挿入します。

    INSERT INTO Client
    VALUES ('aaa00001', 'Satoshi', 'Nakamoto');
    

    次に、行を選択します:

    SELECT * FROM Client;
    

    結果:

    +--------------+-------------+------------+
    | ClientCode   | FirstName   | LastName   |
    |--------------+-------------+------------|
    | aaa00001     | Satoshi     | Nakamoto   |
    +--------------+-------------+------------+
    

    したがって、エイリアスデータ型が指定されたとおりにデータを受け入れたことがわかります。

    しかし、私たちがそれを破ろうとしない限り、それは適切なテストではありません。

    エイリアスに準拠していない値を挿入してみましょう:

    INSERT INTO Client
    VALUES ('aaaa00002', 'Mikko', 'Linnamäki');
    

    結果:

    Msg 8152, Level 16, State 30, Line 1
    String or binary data would be truncated.
    

    この場合、保存に9バイトを必要とする値を挿入しようとしましたが、エイリアスは8バイトまでの値しか受け入れないため、拒否されました。

    文字の1つを削除すると、正常に機能します:

    INSERT INTO Client
    VALUES ('aaa00002', 'Mikko', 'Linnamäki');
    
    SELECT * FROM Client;
    

    結果:

    +--------------+-------------+------------+
    | ClientCode   | FirstName   | LastName   |
    |--------------+-------------+------------|
    | aaa00001     | Satoshi     | Nakamoto   |
    | aaa00002     | Mikko       | Linnamäki  |
    +--------------+-------------+------------+
    

    1. OracleStreamsのステップバイステップのレプリケーションの例

    2. SQLiteクエリ結果で文字列を一重引用符で囲みます

    3. PostgreSQLデータベースのすべてのインデックス名、列名、およびそのテーブル名を一覧表示します

    4. MySQLチュートリアル–MySQLサーバーでのSSLの構成と管理