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

SQLServerのVALUES句

    SQL Serverでは、VALUES は、テーブルに構築される行値式のセットを指定するテーブル値コンストラクターです。

    VALUES 句はINSERTでよく使用されます データを挿入するステートメントですが、USINGのいずれかで派生テーブルとして使用することもできます。 MERGEの句 ステートメントまたはFROM 条項。

    構文
    VALUES ( <row value expression list> ) [ ,...n ]   
      
    <row value expression list> ::=  
        {<row value expression> } [ ,...n ]  
      
    <row value expression> ::=  
        { DEFAULT | NULL | expression }

    DEFAULTに注意してください INSERTでのみ許可されます 声明。 DEFAULT SQLServerに列に定義されたデフォルト値を挿入するように強制します。列にデフォルトが存在せず、列でnull値が許可されている場合、NULL 挿入されます。 DEFAULT ID列には使用できません。

    VALUESの例をいくつか示します。 SQLServerで使用できます。

    INSERTで使用されます ステートメント

    VALUESの使用例を次に示します。 INSERTの一部としての句 ステートメント:

    CREATE TABLE Idiots (
        IdiotId int IDENTITY(1,1) NOT NULL,
        FirstName varchar(50),
        LastName varchar(50)
        );
    
    INSERT INTO Idiots VALUES 
        ('Peter', 'Griffin'), 
        ('Homer', 'Simpson'), 
        ('Ned', 'Flanders');

    これにより、Idiotsというテーブルが作成されました それに3行挿入しました。

    これで、SELECTを使用できます テーブルの新しい値を確認するステートメント:

    SELECT * FROM Idiots;

    結果:

    +-----------+-------------+------------+
    | IdiotId   | FirstName   | LastName   |
    |-----------+-------------+------------|
    | 1         | Peter       | Griffin    |
    | 2         | Homer       | Simpson    |
    | 3         | Ned         | Flanders   |
    +-----------+-------------+------------+

    VALUESの場合 句はINSERTで使用されます ステートメントでは、1000行の制限があります。これを克服する1つの方法は、VALUESを使用することです。 SELECTで 派生テーブルを作成するステートメント。これにより、複数のINSERTを使用する必要がなくなります。 ステートメントまたは一括挿入を実行します。

    SELECTで使用されます ステートメント

    VALUESを使用できます FROMに派生テーブルを作成します 句。これがSELECTです 実証するステートメント:

    SELECT
       FirstName,
       LastName
    FROM
       (VALUES 
            (1, 'Peter', 'Griffin'),
            (2, 'Homer', 'Simpson'),
            (3, 'Ned', 'Flanders')
       ) AS Idiots(IdiotId, FirstName, LastName)
    WHERE IdiotId = 2;

    結果:

    +-------------+------------+
    | FirstName   | LastName   |
    |-------------+------------|
    | Homer       | Simpson    |
    +-------------+------------+

    派生テーブルを使用して、データベースに値を挿入するときに1000行の制限を克服できます。

    MERGEで使用 ステートメント

    これがVALUESの例です MERGEで使用されている ステートメント:

    DECLARE @Changes TABLE(Change VARCHAR(20));
    
    MERGE INTO Idiots AS Target  
    USING ( VALUES 
                (3, 'Ned', 'Okily Dokily!'), 
                (4, 'Lloyd','Christmas'), 
                (5, 'Harry', 'Dunne')
            ) AS Source ( IdiotId, FirstName, LastName )  
    ON Target.IdiotId = Source.IdiotId
    AND Target.FirstName = Source.FirstName
    WHEN MATCHED THEN
        UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
    OUTPUT $action INTO @Changes;
    
    SELECT Change, COUNT(*) AS Count  
    FROM @Changes  
    GROUP BY Change;

    結果:

    +----------+---------+
    | Change   | Count   |
    |----------+---------|
    | INSERT   | 2       |
    | UPDATE   | 1       |
    +----------+---------+

    この場合、VALUESで提供された値に基づいて、1つの行が更新され、2つの新しい行が挿入されました。 条項。

    結果の表は次のとおりです。

    SELECT * FROM Idiots;

    結果:

    +-----------+-------------+---------------+
    | IdiotId   | FirstName   | LastName      |
    |-----------+-------------+---------------|
    | 1         | Peter       | Griffin       |
    | 2         | Homer       | Simpson       |
    | 3         | Ned         | Okily Dokily! |
    | 4         | Lloyd       | Christmas     |
    | 5         | Harry       | Dunne         |
    +-----------+-------------+---------------+

    1. インデックスの断片化の軽減

    2. MySQLの代わりにMySQLiを使用する必要があるのはいつですか?

    3. Oracle-数値をTO_CHARに変換すると、数値の先行ゼロが消えるのはなぜですか

    4. 死ぬことのないゾンビPerfMonカウンター!