Condividi tramite


Costruttore di valori di tabella (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureDatabase SQL in Microsoft Fabric

Specifica un set di espressioni valore di riga da costruire in una tabella. Il costruttore di valori di tabella di Transact-SQL consente di specificare più righe di dati in una sola istruzione DML. Il costruttore del valore di tabella può essere specificato come VALUES clausola di un'istruzione INSERT ... VALUES o come tabella derivata nella USING clausola dell'istruzione MERGE o nella FROM clausola .

Convenzioni relative alla sintassi Transact-SQL

Syntax

VALUES ( <row value expression list> ) [ ,...n ]   

<row value expression list> ::=  
    {<row value expression> } [ ,...n ]  

<row value expression> ::=  
    { DEFAULT | NULL | expression }  

Arguments

VALUES

Introduce gli elenchi di espressioni valore di riga. Ogni elenco deve essere racchiuso tra parentesi e separato da una virgola.

Il numero di valori specificato in ciascun elenco deve essere uguale e i valori devono essere nello stesso ordine delle colonne nella tabella. Deve essere specificato un valore per ogni colonna della tabella oppure nell'elenco delle colonne devono essere specificate in modo esplicito le colonne per ciascun valore inserito.

DEFAULT

Forza l'inserimento nel motore di database del valore predefinito di una colonna. Se non esiste un valore predefinito per la colonna e la colonna consente valori Null, NULL viene inserito . DEFAULT non è valido per una colonna Identity. Se specificato in un costruttore di valori di tabella, DEFAULT è consentito solo in un'istruzione INSERT .

expression

Costante, variabile o espressione. L'espressione non può contenere un'istruzione EXECUTE .

Limitations

Quando usato come tabella derivata non esiste alcun limite per il numero di righe.

Se utilizzata come VALUES clausola di un'istruzione INSERT ... VALUES , è previsto un limite di 1.000 righe. Se il numero massimo di righe viene superato, viene restituito l'errore 10738. Per inserire più di 1.000 righe, utilizzare uno dei metodi seguenti:

Come espressione valore di riga sono consentiti solo valori scalari singoli. Come espressione valore di riga non è consentita una sottoquery che interessa più colonne. Ad esempio, il codice seguente comporta un errore di sintassi perché il terzo elenco di espressioni valore di riga contiene una sottoquery con più colonne.

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  

L'istruzione può tuttavia essere riscritta specificando ogni colonna separatamente nella sottoquery. Nell'esempio seguente vengono inserite tre righe nella tabella MyProducts senza errori.

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  

Tipi di dati

I valori specificati in un'istruzione su più righe INSERT seguono le proprietà di conversione del tipo di dati della UNION ALL sintassi. Ciò comporta la conversione implicita di tipi non corrispondenti nel tipo di precedenza del tipo di dati superiore. Se la conversione non è una conversione implicita supportata, viene generato un errore. Nell'istruzione seguente, ad esempio, vengono inseriti un valore integer e un valore di tipo char in una colonna di tipo char.

CREATE TABLE dbo.t (a INT, b CHAR);  
GO  
INSERT INTO dbo.t VALUES (1,'a'), (2, 1);  
GO  

Quando l'istruzione INSERT viene eseguita, SQL Server tenta di convertire 'a' in un numero intero perché la precedenza del tipo di dati indica che un numero intero è di un tipo superiore a un carattere. La conversione non riesce e viene restituito un errore. Per evitare l'errore, è possibile convertire esplicitamente i valori in modo appropriato. L'istruzione precedente, ad esempio, può essere scritta nel modo seguente:

INSERT INTO dbo.t VALUES (1,'a'), (2, CONVERT(CHAR,1));  

Examples

A. Inserire più righe di dati

Nell'esempio seguente viene creata la tabella dbo.Departments e successivamente viene utilizzato il costruttore di valori di tabella per inserire cinque righe nella tabella stessa. Poiché i valori per tutte le colonne vengono specificati ed elencati nello stesso ordine delle colonne nella tabella, non è necessario specificare i nomi delle colonne nell'elenco delle colonne.

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. Inserire più righe con valori DEFAULT e NULL

Nell'esempio seguente viene illustrato come specificare DEFAULT e NULL quando si usa il costruttore di valori di tabella per inserire righe in una tabella.

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;  

C. Specificare più valori come tabella derivata in una clausola FROM

Negli esempi seguenti viene usato il costruttore di valori di tabella per specificare più valori nella clausola di un'istruzione FROMSELECT .

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. Specificare più valori come tabella di origine derivata in un'istruzione MERGE

Nell'esempio seguente viene MERGE utilizzato per modificare la SalesReason tabella aggiornando o inserendo righe. Quando il valore di nella tabella di NewName origine corrisponde a un valore nella Name colonna della tabella di destinazione (SalesReason), la ReasonType colonna viene aggiornata nella tabella di destinazione. Quando il valore di NewName non corrisponde, la riga di origine viene inserita nella tabella di destinazione. La tabella di origine è una tabella derivata che utilizza il costruttore di valori di tabella di Transact-SQL per specificare più righe per la tabella di origine.

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. Inserire più di 1.000 righe

L'esempio seguente illustra l'uso del costruttore di valori di tabella come tabella derivata. In questo modo è possibile inserire più di 1.000 righe da un singolo costruttore di valori di tabella.

CREATE TABLE dbo.Test ([Value] INT);  

INSERT INTO dbo.Test ([Value])  
  SELECT drvd.[NewVal]
  FROM   (VALUES (0), (1), (2), (3), ..., (5000)) drvd([NewVal]);