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 | +-----------+-------------+---------------+