亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SQLServer 表值構(gòu)造函數(shù)(Transact-SQL)的使用

 更新時間:2024年08月05日 11:44:00   作者:zxrhhm  
表值構(gòu)造函數(shù)是一種用于在單個語句中插入多行數(shù)據(jù)到表中的語法,本文主要介紹了SQLServer 表值構(gòu)造函數(shù)(Transact-SQL)的使用,具有一定的參考價值,感興趣的可以了解一下

在 SQL Server 中,表值構(gòu)造函數(shù)(Table Value Constructor, TVC)是一種用于在單個語句中插入多行數(shù)據(jù)到表中的語法。它允許你以行內(nèi)表值表達式(row-valued expression)的形式指定多行數(shù)據(jù),并將這些數(shù)據(jù)作為一個整體插入到表中。

1、本文內(nèi)容

  • 語法
  • 自變量
  • 限制和局限
  • 數(shù)據(jù)類型
  • 示例
  • 另請參閱

適用于:

  • SQL Server
  • Azure SQL 數(shù)據(jù)庫
  • Azure SQL 托管實例

指定要構(gòu)建到某一表中的一組行值表達式。 Transact-SQL 表值構(gòu)造函數(shù)允許在單個 DML 語句中指定多行數(shù)據(jù)。 表值構(gòu)造函數(shù)可以指定為 INSERT VALUES 語句的 VALUES 子句…或指定為 MERGE 語句 USING 子句中的或 FROM 子句中的派生表。

2、語法

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

NoteTo view Transact-SQL syntax for SQL Server 2014 (12.x) and earlier versions, see Previous versions documentation.

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 語法,請參考如下官方地址

https://learn.microsoft.com/en-us/sql/sql-server/previous-versions-sql-server?view=sql-server-ver16#offline-documentation

3、自變量

  • VALUES
    介紹行值表達式列表。 每個列表都必須用括號括起來并由逗號分隔。

    在每個列表中指定的值的數(shù)目必須相同,并且值必須采用與表中的列相同的順序。 表中每個列的值必須指定,或者列列表必須顯式為每個傳入值指定列。

  • DEFAULT
    強制數(shù)據(jù)庫引擎插入為列定義的默認值。 如果某列并不存在默認值,并且該列允許 Null 值,則插入 NULL。 DEFAULT 對標識列無效。 當在表值構(gòu)造函數(shù)中指定時,只在 INSERT 語句中允許 DEFAULT。

  • expression
    一個常量、變量或表達式。 表達式不能包含 EXECUTE 語句。

4、限制和局限

當指定為派生表時,行數(shù)沒有限制。

當用作 INSERT VALUES 語句的 VALUES 子句時…限制為最多 1000行。 如果行數(shù)超過最大值,則返回錯誤 10738。 若要插入超過 1000 行的數(shù)據(jù),請使用下列方法之一:

  • 創(chuàng)建多個 INSERT 語句

  • 使用派生表

  • 通過使用 bcp 實用工具、.NET SqlBulkCopy 類、OPENROWSET (BULK …) 或 BULK INSERT語句批量導入數(shù)據(jù)

只允許單個標量值作為行值表達式。 涉及多列的子查詢不允許作為行值表達式。 例如,以下代碼導致語法錯誤,因為第三個行值表達式列表包含具有多列的子查詢。

T_Product 表信息如下

在這里插入圖片描述

CREATE TABLE dbo.t_MyProducts (NameInfo NVARCHAR(50), Price decimal(18,2));  
GO  
-- This statement fails because the third values list contains multiple columns in the subquery.  
INSERT INTO dbo.t_MyProducts (NameInfo, Price)  
VALUES (N'鼠標', 25.50),  
       (N'鍵盤', 130.00) ,
       (SELECT Title, Price FROM T_Product WHERE ID = 2);  
GO

但是,可以通過單獨在子查詢中指定每一列,重新編寫該語句。 下面的示例成功地將三行插入 t_MyProducts 表中。

INSERT INTO dbo.t_MyProducts (Name, ListPrice)  
VALUES (N'鼠標', 25.50),  
       (N'鍵盤', 130.00) ,
       ((SELECT Title FROM T_Product WHERE ID = 2),  
        (SELECT Price FROM T_Product WHERE ID = 2));  
GO

select * from dbo.t_MyProducts
GO

在這里插入圖片描述

5、數(shù)據(jù)類型

在多行 INSERT 語句中指定的值遵循 UNION ALL 語法的數(shù)據(jù)類型約定屬性。 這會導致不匹配類型隱式轉(zhuǎn)換到更高優(yōu)先級的類型。 如果此轉(zhuǎn)換不是所支持的隱式轉(zhuǎn)換,則返回錯誤。 例如,以下語句將整數(shù)值和字符值插入到類型為 char 的列中。

CREATE TABLE dbo.t_datatype (col_a INT, col_b CHAR);  
GO  
INSERT INTO dbo.t_datatype  VALUES (1,'a'), (2, 1);  
GO

在這里插入圖片描述

運行 INSERT 語句時,SQL Server 嘗試將 ‘a’ 轉(zhuǎn)換為整數(shù),因為數(shù)據(jù)類型優(yōu)先級指示整數(shù)類型的優(yōu)先級高于字符。 轉(zhuǎn)換失敗,并且返回錯誤。 您可以根據(jù)需要顯式轉(zhuǎn)換值,從而避免發(fā)生此錯誤。 例如,前面的語句可以編寫為:

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

在這里插入圖片描述

6、示例

6.1、插入多行數(shù)據(jù)

下面的示例創(chuàng)建表 dbo.t_MyProducts,然后使用表值構(gòu)造函數(shù)將3行數(shù)據(jù)插入到該表中。 由于提供了所有列的值并按表中各列的順序列出這些值,因此不必在列列表中指定列名。

INSERT INTO t_MyProducts
VALUES (N'華為手機',6888.88), (N'榮耀手機',6688.99),
       (N'小米手機',5999.88);  
GO

SELECT * FROM dbo.t_MyProducts

在這里插入圖片描述

6.2、使用 DEFAULT 和 NULL 值插入多行

下面的示例說明如何在使用表值構(gòu)造函數(shù)向表中插入行時指定 DEFAULT 和 NULL。

CREATE TABLE T_MySalesReason
(  
 ID int IDENTITY(1,1) NOT NULL,  
 NameInfo NVARCHAR(32) NULL ,  
 ReasonType NVARCHAR(32) NOT NULL DEFAULT N'新能源汽車' 
);  
GO  
INSERT INTO T_MySalesReason   
VALUES (N'問界M9',N'增程'), (N'比亞迪唐', DEFAULT), (NULL, N'燃油車');  
  
SELECT * FROM T_MySalesReason;  

在這里插入圖片描述

6.3、在 FROM 子句中將多個值指定為派生表

下面的示例在 SELECT 語句的 FROM 子句中使用表值構(gòu)造函數(shù)指定多個值。

SELECT col_a,col_b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(col_a, col_b);  
GO  
-- Used in an inner join to specify values to return.  
SELECT NameInfo,a.ReasonType,b.Name
FROM T_MySalesReason AS a  
  INNER JOIN (VALUES (N'問界M9'), (N'比亞迪唐'), (N'寶馬X3')) AS b (Name)   ON a.NameInfo = b.Name;
-- Used in an cross join to specify values to return.  
SELECT NameInfo,a.ReasonType,b.Name
FROM T_MySalesReason AS a  
  CROSS JOIN (VALUES (N'問界M9'), (N'比亞迪唐'), (N'寶馬X3')) AS b (Name);

在這里插入圖片描述

6.4、在 MERGE 語句中將多個值指定為派生源表

下面的示例使用 MERGE 以更新或插入行的方式來修改 T_MySalesReason 表。 當源表中的 NewName 值與目標表 NameInfo列中的值匹配時,就會更新此目標表中的 ReasonType 列。 當 NewName 的值不匹配時,就會將源行插入到目標表中。 此源表是一個派生表,它使用 Transact-SQL 表值構(gòu)造函數(shù)指定源表的多個行。

-- Create a temporary table variable to hold the output actions.  
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));  
  
MERGE INTO T_MySalesReason AS Target  
USING (VALUES (N'問界M9',N'綠牌'), (N'比亞迪唐', N'綠牌'), (N'寶馬X3', N'藍牌'))  
       AS Source (NewName, NewReasonType)  
ON Target.NameInfo = Source.NewName  
WHEN MATCHED THEN  
  UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
  INSERT (NameInfo, 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;

在這里插入圖片描述

查詢表返回結(jié)果集如下,滿足預期的結(jié)果

在這里插入圖片描述

6.5、 插入超過 1000 行

以下示例演示如何將表值構(gòu)造函數(shù)用作派生表。 此方式可從單個表值構(gòu)造函數(shù)中插入超過 1000 行。

CREATE TABLE dbo.T_TestValue ([Value] INT);  
  
INSERT INTO dbo.T_TestValue ([Value])  
SELECT [NewVal]
FROM   (VALUES (0), (1), (2), (3), ..., (5000)) AS Temp01 ([NewVal]);

7、另請參閱

到此這篇關(guān)于SQLServer 表值構(gòu)造函數(shù)(Transact-SQL)的使用的文章就介紹到這了,更多相關(guān)SQL 表值構(gòu)造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評論