志铭-2021年10月2日 22:21:00

0. 复制表中一列插入到另外一列

--将col2列值复制给col1
UPDATE table_name SET col1_name=col2_name
WHERE col1_condition

1. 复制表结构和数据到自动创建的一张新表中——select into

当需要备份某张表的记录的时候,常常需要根据现有的表复制一个备份表

下面示例,从表table1复制出一张表table2

  • table_name2 会自动创建,所以不需要 也不可以 事先创建好
  • 从table1复制到table2中的仅仅是指定字段和字段的值,不包含主键、索引、约束和触发器,所以千万不要通过此种方式创建一个相同字段,相同功能的表(若是需要还是选中表右键-->编写脚本为-->create到
--复制部分的字段
SELECT col1,col2,col3…… INTO table_name2 FROM table_name1
--复制所以的字段
SELECT * INTO table_name2 FROM table_name1
--复制部分记录
SELECT * INTO table_name2 FROM table_name1 WHERE table_name1_col_conditionc
--只复制表的字段名,不复制数据(即:创建一个空表)
SELECT * INTO table_name2 FROM table_name1 WHERE 1<>1
SELECT TOP 0 INTO table_name2 FROM table_name1
  • SELECT INTO语句可以复制数据到一个自动创建的临时表中
  • SELECT INTO语句不支持表变量,既不能自动创建一个表变量,也不能将数据复制到一个已声明的表变量中
IF OBJECT_ID('tempdb.. #tempTable') IS NOT NULL
BEGIN
DROP TABLE #tempTable;
END; SELECT * INTO #tempTable
FROM table1; SELECT * FROM #tempTable
DROP TABLE #tempTable

2. 复制表中一些字段值插入到另外一张表中——insert into

复制表table1中某几列数据插入(更新)到表table2中的某几列

  • table2必须已经存在,其字段不需要和table1中一样
  • table2可以是已创建的临时表,也可以是已声明的表变量
INSERT INTO table2_name(col1,col2,col3)
SELECT col1,col2,col3 FROM table1
WHERE table1_condition

3. 将存储过过程结果保存在临时表或表变量中

将存储过程的结果保存在临时表,需要使用insert into,即需要使用先创建临时表的方式

  • 注意一定:定义的临时表的字段需要和存储过程返回的结果集的字段完全一样,不能多也不能少

示例:

  1. 准备测试表及数据
--准备测试表及数据
CREATE TABLE Person
(
[Id] INT,
[Name] NVARCHAR(50),
[Age] INT,
[ClassId] NVARCHAR(50)
);
INSERT INTO Person
VALUES
(2, N'Jerry', 7, N'11'),
(3, N'Bob', 7, N'11'),
(4, N'Allen', 7, N'11'),
(5, N'Andy', 8, N'22'),
(6, N'Beck', 8, N'22'),
(7, N'Billy', 8, N'22');
  1. 创建一个简单的存储过程
--创建一个存储过程
CREATE PROCEDURE pro_GetPerson
AS
BEGIN
SELECT Name,Age FROM Person
END
  1. 执行存过并将结果保存到临时表
--执行存储过程将结果保存在临时表中
----创建临时表
IF OBJECT_ID('tempdb..#Person') IS NOT NULL
BEGIN
DROP TABLE #Person
END
CREATE TABLE #Person
(
Name NVARCHAR(50),
AGE INT
)
----执行存储过程并保存到临时表中
INSERT INTO #Person Exec pro_GetPerson
SELECT * FROM #Person
  1. 执行存过并将结果赋值给表变量
----定义表变量并将存储过程的结果赋值给表变量
DECLARE @Person TABLE
(
Name NVARCHAR(50),
Age INT
)
INSERT INTO @Person EXEC dbo.pro_GetPerson
SELECT * FROM @Person

若是希望避免手动建表或手动创建表变量,而使用select into的方式

则需要通过OPENROWSET方法。

除非纯粹就是临时从一个表往另外一个表导数据,不要在存储过程中使用以下方法

  • 注意:使用OPENROWSET执行存储过程是无法执行带有参数的存储过程的

示例:

IF OBJECT_ID('tempdb..#temp') IS NOT NULL
BEGIN
DROP TABLE #temp
END SELECT * INTO #temp
FROM
OPENROWSET('sqloledb', 'server=severname;uid=uid;pwd=password', 'exec 数据库名.dbo.pro');--注:此方法执行存储过程无法带参数
SELECT * FROM #temp;

4. 将动态SQL语句的结果保存在临时表中

实现方法和上述执行存储过程保存到临时表和表变量的方法一样

--动态SQL语句
DECLARE @sqlStr VARCHAR(5000) = 'SELECT Name FROM Company';
--表变量
DECLARE @tableVar TABLE
(
Name VARCHAR(100)
);
--执行动态SQL将结果保存在表变量中
INSERT INTO @tableVar
EXEC (@sqlStr); SELECT * FROM @tableVar;

5. 参考

T-SQL——关于表数据的复制插入的更多相关文章

  1. 09Microsoft SQL Server 表数据插入,更新,删除

    Microsoft SQL Server 表数据插入,更新,删除 向表中插入数据 INSERT INTO insert into tb1 values(0004,'张凤凤') insert into ...

  2. SQL Server大量数据秒级插入/新增/删除

    原文:SQL Server大量数据秒级插入/新增/删除 1.快速保存,该方法有四个参数,第一个参数为数据库连接,第二个参数为需要保存的DataTable,该参数的TableName属性需要设置为数据库 ...

  3. oracle复制表数据,复制表结构

    1.不同用户之间的表数据复制 2.同用户表之间的数据复制 3.B.x中个别字段转移到B.y的相同字段 4.只复制表结构 加入了一个永远不可能成立的条件1=2,则此时表示的是只复制表结构,但是不复制表内 ...

  4. oracle 复制表数据,复制表结构

    1.不同用户之间的表数据复制 对于在一个数据库上的两个用户A和B,假如需要把A下表old的数据复制到B下的new,请使用权限足够的用户登入sqlplus:insert into B.new(selec ...

  5. Oracle学习(二)SQL高级--表数据相关

    SQL高级语句 top / limit / rownum / percent (前XXX条数据) --top(SQL Server / MS Access) select top 条数 from 表; ...

  6. sql 删除表数据truncate delete drop的区别

    已下内容为转载内容:学习之用 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. ...

  7. [转] sql 删除表数据的drop、truncate和delete用法

    删除表数据的关键字,大家记得最多的可能就是delete.然而,我们做数据库开发,读取数据库数据.对另外的drop.truncate用得就比较少了. 1 drop 出没场合:drop table  ta ...

  8. sql关联表查询结果并插入

    这里涉及三个表,AA,BB,CC,将AA的数据更新到CC表中,将AA中LABEL_ID分别截取字段与BB表中的label_id对应查询到LABEL_NAME作为CC表的一个字段插入,这里分成四段查询 ...

  9. 快速检查SQL两表数据是否一致

    1前话 项目内实现了一新功能:克隆数据库. 2目标 克隆并非用SQLSERVER克隆,故完毕后需要检查各表内一些数据与原表一致性.一些表中的某一些列容许不一致. 3实现 将两表的需要检查的几列取出,相 ...

随机推荐

  1. c# 对 struct为什么不能继承类和结构的思考

    1.类.结构在使用的时候可以不调用构造函数,如果能够继承类,这种情况下不能够初始化基类,因为不执行构造函数 2.结构.所有的结构类型都默认是 sealed,通过 反汇编可以看到  ,这就阻止了结构被继 ...

  2. beeline: 新版连接Hive server的工具

    HiveServer2 支持一个新的命令行Shell,称为Beeline,它是基于SQLLine CLI的JDBC客户端.它是从 Hive 0.11版本引入的,是Hive新的命令行客户端工具.Hive ...

  3. WPF 获取主线程

    WPF线程获取UI线程   WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Act ...

  4. Java第一阶段项目实训

    时间:2016-3-27 17:09 银行综合业务平台业务需求 1.首页  ---------------银行综合业务平台------------------- 1开户     2登录    3.退出 ...

  5. mybaits源码分析--日志模块(四)

    一.日志模块 首先日志在我们开发过程中占据了一个非常重要的地位,是开发和运维管理之间的桥梁,在Java中的日志框架也非常多,Log4j,Log4j2,Apache Commons Log,java.u ...

  6. netty系列之:搭建自己的下载文件服务器

    目录 简介 文件的content-type 客户端缓存文件 其他HTTP中常用的处理 文件内容展示处理 文件传输进度 总结 简介 上一篇文章我们学习了如何在netty中搭建一个HTTP服务器,讨论了如 ...

  7. 【Qt pro 文件配置】

    一.默认配置 默认的pro文件配置如下: 如果采用Qt默认的pro配置,其编译后产生的文件会默认集中分布在debug和release目录下,如下图的obj和moc等文件对后续打包发布并没有意义. 二. ...

  8. linux centos7 重启后网络出现问题

    2021-08-04 重启虚拟机后发现网络出了问题,输入 ip a 查看网络,出现以下情况 查看配置文件 cat /etc/sysconfig/network-scripts/ifcfg-ens33  ...

  9. Spring系列之JDBC对不同数据库异常如何抽象的?

    前言 使用Spring-Jdbc的情况下,在有些场景中,我们需要根据数据库报的异常类型的不同,来编写我们的业务代码.比如说,我们有这样一段逻辑,如果我们新插入的记录,存在唯一约束冲突,就会返回给客户端 ...

  10. 【Elasticsearch】.NetCore中Elasticsearch组件NEST的使用

    .NetCore中Elasticsearch组件NEST的使用 1. 安装Docker # 安装Docker curl -fsSL https://get.docker.com | bash -s d ...