Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de données SQL dans Microsoft Fabric
Spécifie un ensemble d'expressions de valeurs de ligne à créer dans une table. Le constructeur de valeurs de table Transact-SQL permet de spécifier plusieurs lignes de données dans une seule instruction DML. Le constructeur de valeur de table peut être spécifié en tant que VALUES
clause d’une INSERT ... VALUES
instruction, ou sous forme de table dérivée dans la USING
clause de l’instruction MERGE
ou de la FROM
clause.
Conventions de la syntaxe Transact-SQL
Syntaxe
VALUES ( <row value expression list> ) [ ,...n ]
<row value expression list> ::=
{<row value expression> } [ ,...n ]
<row value expression> ::=
{ DEFAULT | NULL | expression }
Les arguments
VALEURS
Introduit les listes d'expressions de valeurs de ligne. Chaque liste doit être placée entre parenthèses et séparée par une virgule.
Le nombre de valeurs spécifiées doit être identique dans chaque liste et les valeurs doivent être dans le même ordre que les colonnes de la table. Une valeur doit être spécifiée pour chaque colonne de la table ou la liste de colonnes doit spécifier explicitement les colonnes pour chaque valeur entrante.
DÉFAUT
Force le Moteur de base de données à insérer la valeur par défaut définie pour une colonne. Si une valeur par défaut n’existe pas pour la colonne et que la colonne autorise les valeurs Null, NULL
est insérée.
DEFAULT
n’est pas valide pour une colonne d’identité. Lorsqu’il est spécifié dans un constructeur de valeur de table, DEFAULT
n’est autorisé que dans une INSERT
instruction.
expression
Constante, variable ou expression. L’expression ne peut pas contenir d’instruction EXECUTE
.
Limites
Dans le cadre d’une table dérivée, aucune limite ne s’applique au nombre de lignes.
Lorsqu’elle est utilisée comme VALUES
clause d’une INSERT ... VALUES
instruction, il existe une limite de 1 000 lignes. L’erreur 10738 est retournée si le nombre de lignes dépasse la valeur maximale. Pour insérer plus de 1 000 lignes, utilisez l’une des méthodes suivantes :
Créez plusieurs
INSERT
instructions.Utilisez une table dérivée.
Importez en bloc les données à l’aide de l’utilitaire bcp, de la classe .NET SqlBulkCopy, d’OPENROWSET BULK ou de l’instruction BULK INSERT .
Seules les valeurs scalaires uniques sont autorisées en tant qu'expression de valeurs de ligne. Une sous-requête qui implique plusieurs colonnes n'est pas autorisée en tant qu'expression de valeurs de ligne. Par exemple, le code suivant génère une erreur de syntaxe car la troisième liste d'expressions de valeurs de ligne contient une sous-requête avec plusieurs colonnes.
USE AdventureWorks2022;
GO
CREATE TABLE dbo.MyProducts (Name VARCHAR(50), ListPrice MONEY);
GO
-- This statement fails because the third values list contains multiple columns in the subquery.
INSERT INTO dbo.MyProducts (Name, ListPrice)
VALUES ('Helmet', 25.50),
('Wheel', 30.00),
(SELECT Name, ListPrice FROM Production.Product WHERE ProductID = 720);
GO
Toutefois, l'instruction peut être réécrite en spécifiant séparément chaque colonne dans la sous-requête. L'exemple suivant insère correctement trois lignes dans la table MyProducts
.
INSERT INTO dbo.MyProducts (Name, ListPrice)
VALUES ('Helmet', 25.50),
('Wheel', 30.00),
((SELECT Name FROM Production.Product WHERE ProductID = 720),
(SELECT ListPrice FROM Production.Product WHERE ProductID = 720));
GO
Types de données
Les valeurs spécifiées dans une instruction à plusieurs lignes INSERT
suivent les propriétés de conversion de type de données de la UNION ALL
syntaxe. Cela entraîne la conversion implicite de types sans correspondance vers le type de priorité de type de données supérieur. Si la conversion n'est pas prise en charge en tant que conversion implicite, une erreur est renvoyée. Par exemple, l’instruction suivante insère un nombre entier et un caractère dans une colonne de type char.
CREATE TABLE dbo.t (a INT, b CHAR);
GO
INSERT INTO dbo.t VALUES (1,'a'), (2, 1);
GO
Lorsque l’instruction INSERT
est exécutée, SQL Server tente de convertir « a » en entier, car la précédence du type de données indique qu’un entier est d’un type supérieur à un caractère. La conversion échoue et une erreur est retournée. Vous pouvez éviter cette erreur en utilisant la conversion explicite des valeurs. Par exemple, l'instruction précédente peut être écrite de la façon suivante :
INSERT INTO dbo.t VALUES (1,'a'), (2, CONVERT(CHAR,1));
Exemples
R. Insérer plusieurs lignes de données
L'exemple suivant crée la table dbo.Departments
, puis utilise le constructeur de valeurs de table pour insérer cinq lignes dans la table. Étant donné que les valeurs de toutes les colonnes sont fournies et qu'elles sont répertoriées dans le même ordre que les colonnes de la table, il n'est pas nécessaire de spécifier les noms de colonnes dans la liste de colonnes.
USE AdventureWorks2022;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923'),
(N'Y3', N'Cubic Yards', '20080923');
GO
B. Insérer plusieurs lignes avec des valeurs DEFAULT et NULL
L’exemple suivant illustre la DEFAULT
spécification et NULL
l’utilisation du constructeur de valeur de table pour insérer des lignes dans une table.
USE AdventureWorks2022;
GO
CREATE TABLE Sales.MySalesReason(
SalesReasonID int IDENTITY(1,1) NOT NULL,
Name dbo.Name NULL ,
ReasonType dbo.Name NOT NULL DEFAULT 'Not Applicable' );
GO
INSERT INTO Sales.MySalesReason
VALUES ('Recommendation','Other'), ('Advertisement', DEFAULT), (NULL, 'Promotion');
SELECT * FROM Sales.MySalesReason;
Chapitre C. Spécifier plusieurs valeurs en tant que table dérivée dans une clause FROM
Les exemples suivants utilisent le constructeur de valeur de table pour spécifier plusieurs valeurs dans la FROM
clause d’une SELECT
instruction.
SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
GO
-- Used in an inner join to specify values to return.
SELECT ProductID, a.Name, Color
FROM Production.Product AS a
INNER JOIN (VALUES ('Blade'), ('Crown Race'), ('AWC Logo Cap')) AS b(Name)
ON a.Name = b.Name;
D. Spécifier plusieurs valeurs en tant que table source dérivée dans une instruction MERGE
L’exemple suivant utilise MERGE
pour modifier la SalesReason
table en mettant à jour ou en insérant des lignes. Lorsque la valeur de NewName
la table source correspond à une valeur dans la Name
colonne de la table cible (SalesReason
), la ReasonType
colonne est mise à jour dans la table cible. Lorsque la valeur de NewName
ne correspond à aucune autre valeur, la ligne source est insérée dans la table cible. La table source est une table dérivée qui utilise le constructeur de valeurs de table Transact-SQL afin de spécifier plusieurs lignes pour la table source.
USE AdventureWorks2022;
GO
-- Create a temporary table variable to hold the output actions.
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));
MERGE INTO Sales.SalesReason AS Target
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))
AS Source (NewName, NewReasonType)
ON Target.Name = Source.NewName
WHEN MATCHED THEN
UPDATE SET ReasonType = Source.NewReasonType
WHEN NOT MATCHED BY TARGET THEN
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)
OUTPUT $action INTO @SummaryOfChanges;
-- Query the results of the table variable.
SELECT Change, COUNT(*) AS CountPerChange
FROM @SummaryOfChanges
GROUP BY Change;
E. Insérer plus de 1 000 lignes
L’exemple suivant illustre l’utilisation du constructeur de valeurs de table en tant que table dérivée. Cela permet d’insérer plus de 1 000 lignes à partir d’un constructeur de valeur de table unique.
CREATE TABLE dbo.Test ([Value] INT);
INSERT INTO dbo.Test ([Value])
SELECT drvd.[NewVal]
FROM (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);