SQLServer 表值构造函数 (Transact-SQL)

news2024/11/26 3:51:25

在 SQL Server 中,表值构造函数(Table Value Constructor, TVC)是一种用于在单个语句中插入多行数据到表中的语法。它允许你以行内表值表达式(row-valued expression)的形式指定多行数据,并将这些数据作为一个整体插入到表中。

1、本文内容

  • 语法
  • 自变量
  • 限制和局限
  • 数据类型
  • 示例
  • 另请参阅

适用于:

  • SQL Server
  • Azure SQL 数据库
  • Azure SQL 托管实例

指定要构建到某一表中的一组行值表达式。 Transact-SQL 表值构造函数允许在单个 DML 语句中指定多行数据。 表值构造函数可以指定为 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 }

Note
To 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
    介绍行值表达式列表。 每个列表都必须用括号括起来并由逗号分隔。

    在每个列表中指定的值的数目必须相同,并且值必须采用与表中的列相同的顺序。 表中每个列的值必须指定,或者列列表必须显式为每个传入值指定列。

  • DEFAULT
    强制数据库引擎插入为列定义的默认值。 如果某列并不存在默认值,并且该列允许 Null 值,则插入 NULL。 DEFAULT 对标识列无效。 当在表值构造函数中指定时,只在 INSERT 语句中允许 DEFAULT。

  • expression
    一个常量、变量或表达式。 表达式不能包含 EXECUTE 语句。

4、限制和局限

当指定为派生表时,行数没有限制。

当用作 INSERT VALUES 语句的 VALUES 子句时…限制为最多 1000行。 如果行数超过最大值,则返回错误 10738。 若要插入超过 1000 行的数据,请使用下列方法之一:

  • 创建多个 INSERT 语句

  • 使用派生表

  • 通过使用 bcp 实用工具、.NET SqlBulkCopy 类、OPENROWSET (BULK …) 或 BULK INSERT语句批量导入数据

只允许单个标量值作为行值表达式。 涉及多列的子查询不允许作为行值表达式。 例如,以下代码导致语法错误,因为第三个行值表达式列表包含具有多列的子查询。

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、数据类型

在多行 INSERT 语句中指定的值遵循 UNION ALL 语法的数据类型约定属性。 这会导致不匹配类型隐式转换到更高优先级的类型。 如果此转换不是所支持的隐式转换,则返回错误。 例如,以下语句将整数值和字符值插入到类型为 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’ 转换为整数,因为数据类型优先级指示整数类型的优先级高于字符。 转换失败,并且返回错误。 您可以根据需要显式转换值,从而避免发生此错误。 例如,前面的语句可以编写为:

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

在这里插入图片描述

6、示例

6.1、插入多行数据

下面的示例创建表 dbo.t_MyProducts,然后使用表值构造函数将3行数据插入到该表中。 由于提供了所有列的值并按表中各列的顺序列出这些值,因此不必在列列表中指定列名。

INSERT INTO t_MyProducts
VALUES (N'华为手机',6888.88), (N'荣耀手机',6688.99),
       (N'小米手机',5999.88);  
GO

SELECT * FROM dbo.t_MyProducts

在这里插入图片描述

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

下面的示例说明如何在使用表值构造函数向表中插入行时指定 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 子句中使用表值构造函数指定多个值。

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 表值构造函数指定源表的多个行。

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

在这里插入图片描述
查询表返回结果集如下,满足预期的结果
在这里插入图片描述

6.5、 插入超过 1000 行

以下示例演示如何将表值构造函数用作派生表。 此方式可从单个表值构造函数中插入超过 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、另请参阅

  • INSERT (Transact-SQL)
    https://learn.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver16

  • MERGE (Transact-SQL)
    https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16

  • FROM (Transact-SQL)
    https://learn.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver16

欢迎点赞、收藏、转发。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1875891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于weixin小程序周边美食系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;美食店铺管理&#xff0c;菜品分类管理&#xff0c;标签管理&#xff0c;菜品信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美食店铺&#x…

ROS2使用Python创建服务提供者、消费者

1.创建服务提供者 ros2 pkg create example_service_rclpy --build-type ament_python --dependencies rclpy example_interfaces --node-name service_server_02 service_server_02.py 代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node # 导入接口 …

办公软件WPS与Office的区别

临近计算机考试很多同学在纠结我是报wps好&#xff1f;还是ms office好&#xff1f;下面就来详细说说。 1、wps属于国内金山公司的办公软件&#xff0c;里面包含word、Excel和PPT。考试是2021年开始的&#xff01; 2、MS&#xff08;Microsoft 微软&#xff09; office属于美…

web安全渗透测试十大常规项(一):web渗透测试之深入JAVA反序列化

渗透测试之PHP反序列化 1. Java反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411. Java反序列化 1.1 FastJson反序列化链知识点 1、为什…

线程池技术实现及参数工作流程原理

一.什么是线程池 线程池其实就是一种多线程处理形式&#xff0c;处理过程中可以将任务添加到队列中&#xff0c;然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象。 为什么使用多线程…

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建&#xff08;设备型&#xff09; 一&#xff0c; 文档介绍二&#xff0c; 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三&#xff0c; MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…

修改docker中mongodb容器的时区

假设容器名称为mongodb&#xff0c;设置时区为上海时区的命令为&#xff1a; docker exec -it mongodb bash -c "ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone"验证时区更改&#xff1a; docker e…

Eigen中关于四元数的常用操作

四元数&#xff08;Quaternion&#xff09;是一种数学工具&#xff0c;广泛用于计算机图形学、机器人学和物理模拟中&#xff0c;特别适合处理三维旋转。Eigen库是一个高性能的C数学库&#xff0c;提供了丰富的线性代数功能&#xff0c;其中就包括对四元数的支持。 1. 为什么选…

element ui form 表单验证

表单验证方法 在el-form元素上总体设置校验规则rules&#xff0c;下面是官方案例 <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><el-form-item label"…

基于Java游戏售卖网站详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中&#xff0c;安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目&#xff0c;用于提供安全访问控制的功能。通过集成Spring Security&#xff0c;我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始&am…

Qt Creator创建一个用户登录界面

目录 1 界面设计 2 代码 2.1 登录界面 2.2 注册界面 2.3 登陆后的界面 3 完整资源 这里主要记录了如何使用Qt Creator创建一个用户登录界面&#xff0c;能够实现用户的注册和登录功能&#xff0c;注册的用户信息存储在了一个文件之中&#xff0c;在登录时可以比对登录信息…

模型预测控制:线性MPC

模型预测控制&#xff1a;线性MPC 模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种广泛应用于工业过程控制和自动驾驶等领域的先进控制技术。MPC通过在线解决优化问题来计算控制输入&#xff0c;从而实现系统的最优控制。本文将介绍线性MPC的系统模…

C# 实现websocket双向通信

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C# &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff…

【地理库 Turf.js】

非常全面的地理库 &#xff0c; 这里枚举一些比较常用&#xff0c;重点的功能&#xff0c; 重点功能 提供地理相关的类&#xff1a;包括点&#xff0c;线&#xff0c;面等类。 测量功能&#xff1a;点到线段的距离&#xff0c;点和线的关系等。 判断功能&#xff1a; 点是否在…

Ubuntu系统打包ISO镜像文件

本文以ubuntu20.04系统为例 1.Systemback简介 Systemback 是一个开源的系统备份和恢复工具&#xff0c;它主要用于 Linux 操作系统。Systemback 可以帮助用户创建完整的系统备份&#xff0c;包括操作系统、应用程序、用户数据等&#xff0c;并且可以在需要时将系统恢复到备份的…

5G频段简介

5G频段 5G网络一共有29个频段&#xff0c;主要被分为两个频谱范围&#xff0c;其中6GHz以下的频段共有26个&#xff08;统称为Sub6GHz&#xff09;&#xff0c;毫米波频段有3个。目前国内主要使用的是Sub6GHz&#xff0c;包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

centos上部署Ollama平台,实现语言大模型本地部署

网上有很多大模型&#xff0c;很多都是远程在线调用ChatGPT的api来实现的&#xff0c;自己本地是没有大模型的&#xff0c;这里和大家分享一个大模型平台&#xff0c;可以实现本地快速部署大模型。 Ollama是一个开源项目&#xff0c;它提供了一个平台和工具集&#xff0c;用于部…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解&#xff0c;接…

数字化那点事:一文读懂数字乡村

一、数字乡村的定义 数字乡村是指利用信息技术和数字化手段&#xff0c;推动乡村社会经济发展和治理模式变革&#xff0c;提升乡村治理能力和公共服务水平&#xff0c;实现乡村全面振兴的一种新型发展模式。它包括农业生产的数字化、乡村治理的智能化、乡村生活的现代化等方面…