共用方式為


資料表值建構函式 (Transact-SQL)

適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 SQL 資料庫

指定要建構到資料表中的一組資料列值運算式。 Transact-SQL 資料表值建構函式允許在單一 DML 陳述式中指定多個資料列。 數據表值建構函式可以指定為 VALUES 語句的 INSERT ... VALUES 子句,也可以指定為 語句或 USING 子句的 MERGE 子句中的FROM衍生數據表。

Transact-SQL 語法慣例

語法

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

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

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

引數

導入資料列值運算式清單。 每一個清單都必須以括號括住,並以逗點隔開。

每一個清單中指定的值數目都必須相同,而且值的順序必須與資料表中的資料行相同。 必須指定資料表中每一個資料行的值,或者資料行清單必須明確指定每一個內送值的資料行。

預設

強制資料庫引擎插入定義給資料行的預設值。 如果資料列的預設值不存在,而且資料列允許 Null 值, NULL 則會插入 。 DEFAULT 對識別數據行無效。 在數據表值建構函式中指定時, DEFAULT 只能在語句中 INSERT 允許。

表示式

常數、變數或表達式。 表達式不能包含 EXECUTE 語句。

局限性

用作衍生資料表時,資料列數目沒有限制。

當做 VALUES 語句的 INSERT ... VALUES 子句使用時,有 1,000 個數據列的限制。 如果資料列數目超過最大值,就會傳回錯誤 10738。 若要插入超過 1,000 個資料列,請使用下列其中一種方法:

只允許使用單一純量值當做資料列值運算式。 不允許使用牽涉多個資料行的子查詢當做資料列值運算式。 例如,下列程式碼會產生語法錯誤,因為第三個資料列值運算式清單包含具有多個資料行的子查詢。

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  

不過,您可以個別在子查詢中指定每個資料行,藉以重新撰寫此陳述式。 下列範例會成功地將三個資料列插入 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  

數據類型

在多數據列 INSERT 語句中指定的值會遵循語法的 UNION ALL 數據類型轉換屬性。 這會導致不相符的類型隱含轉換成較高 數據類型優先順序的類型。 如果轉換不是支援的隱含轉換,就會傳回錯誤。 例如,下列陳述式會將整數值和字元值插入至類型為 char 的資料行中。

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

INSERT執行語句時,SQL Server 會嘗試將 『a』 轉換成整數,因為數據類型優先順序表示整數的類型高於字元。 轉換會失敗,並傳回錯誤。 您可以適當且明確地轉換值來避免這個錯誤。 例如,可以依照以下方式撰寫上面的陳述式。

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

範例

A。 插入多個數據列

下列範例會建立 dbo.Departments 資料表,然後使用資料表值建構函式將五個資料列插入此資料表。 由於提供了所有資料行的值,而且依照資料表中資料行的相同順序來列出它們,因此,不需要在資料行清單中指定資料行名稱。

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. 使用 DEFAULT 和 NULL 值插入多個資料列

下列範例示範如何使用 DEFAULT 資料表值建構函式將資料列插入資料表中,以及 NULL 何時指定 和 。

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. 在FROM子句中將多個值指定為衍生數據表

下列範例會使用數據表值建構函式,在語句的 FROM 子句中SELECT指定多個值。

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. 將多個值指定為 MERGE 語句中的衍生源數據表

下列範例會使用 MERGE 更新或插入數據列來修改 SalesReason 數據表。 當源數據表中的 值符合目標數據表數據列中的NewNameName時,SalesReason就會ReasonType在目標數據表中更新數據行。 當 NewName 的值不相符時,來源資料列會插入目標資料表中。 來源資料表是一種衍生資料表,可使用 Transact-SQL 資料表值建構函式針對來源資料表指定多個資料列。

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. 插入超過 1,000 個數據列

下列範例示範如何使用資料表值建構函式作為衍生資料表。 這允許從單一數據表值建構函式插入超過 1,000 個數據列。

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

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