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

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

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

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

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

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

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

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

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

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

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

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

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

示例:

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

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

则需要通过OPENROWSET方法。

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

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

示例:

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

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

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

  1. --动态SQL语句
  2. DECLARE @sqlStr VARCHAR(5000) = 'SELECT Name FROM Company';
  3. --表变量
  4. DECLARE @tableVar TABLE
  5. (
  6. Name VARCHAR(100)
  7. );
  8. --执行动态SQL将结果保存在表变量中
  9. INSERT INTO @tableVar
  10. EXEC (@sqlStr);
  11. 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. Springboot使用MatrixVariable 注解

        根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对.规范中没对对应的术语.一般 "URL 路径参数" 可以被应用,尽管更加独特的 &qu ...

  2. 一 MongoDB入门

    一.MongoDB概念解析(对比MySQL学习): 举个例子: MongoDB可视化操作工具:推荐Robomongo 二.MongoDB默认的概念: 1.MongoDB的单个实例可以容纳多个独立的数据 ...

  3. ProjectEuler 004题

    1 #include<iostream> 2 using namespace std; 3 4 int main() { 5 bool isPalindromic (int num); 6 ...

  4. Python代码阅读(第1篇):列表映射后的平均值

    本篇阅读的代码实现了将列表进行映射,并求取映射后的平均值. 本篇阅读的代码片段来自于30-seconds-of-python. average_by def average_by(lst, fn=la ...

  5. Web应用安全防护-WAF

    web应用开发中不可避免需要考虑web应用的安全问题,那么常见的安全风险包含哪些呢? Web应用常见的安全风险 在web应用开发中可能存在以下的安全风险: 安全风险Top 10 A1:2017-注入 ...

  6. 接上一篇安装linux问题,解决redis安装后make test错误

    (file "tests/helpers/bg_complex_data.tcl" line 10) Killing still running Redis server 3987 ...

  7. idea无法使用中文输入法输入

    问题--idea无法使用中文输入 原因:idea本身版本过高,所以需要你强制减低它的jdk版本 解决:使用配置idea环境变量解决 ps:目前适用于任何版本的jdk和idea 步骤: 1.新建一个ID ...

  8. 关于antd Select 限制选择个数的解决方案

    应用场景描述: Select 被form 所包裹,且被getFieldDecorator修饰.所以值的改变应该通过form的setFieldsValue方法. Select模式肯定会是multiple ...

  9. noip模拟44

    A. Emotional Flutter 直接将所有黑块平移到 \([1-k,0]\) 的区间即可,然后找有没有没被覆盖过的整点 注意特判 \(1-k\) 以及 \(0\) 的可行性,考场这里写挂成 ...

  10. [考试总结]noip模拟44

    这个真的是一个 \(nb\) 题. 考试快要结束的时候,在机房中只能听到此起彼伏的撕吼. 啊---------- 然后人们预测这自己的得分. \(\color{red}{\huge{0}}\) \(\ ...