T-SQL——关于表数据的复制插入
2021-10-02 22:25
633 查看
目录
- 0. 复制表中一列插入到另外一列
- 1. 复制表结构和数据到自动创建的一张新表中——select into
- 2. 复制表中一些字段值插入到另外一张表中——insert into
- 3. 将存储过过程结果保存在临时表或表变量中
- 4. 将动态SQL语句的结果保存在临时表中
- 5. 参考
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,即需要使用先创建临时表的方式
- 注意一定:定义的临时表的字段需要和存储过程返回的结果集的字段完全一样,不能多也不能少
示例:
- 准备测试表及数据
--准备测试表及数据 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');
- 创建一个简单的存储过程
--创建一个存储过程 CREATE PROCEDURE pro_GetPerson AS BEGIN SELECT Name,Age FROM Person END
- 执行存过并将结果保存到临时表
--执行存储过程将结果保存在临时表中 ----创建临时表 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
- 执行存过并将结果赋值给表变量
----定义表变量并将存储过程的结果赋值给表变量 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. 参考
相关文章推荐
- 关于SQL插入数据出现当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'XXXX' 中的标识列插入XXX
- 获取某个表的数据,并产生插入这些数据的SQL(主要用于不同服务器间相同结构表的数据复制)。
- 关于服务器端MySQL数据库插入数据、运行sql文件时抛出packet bigger than 'max_allowed_packet'的
- Sql 表复制、数据插入、字段移植
- 关于从sql*plus中往数据库插入数据却查询不到的原因
- sql 把数据复制插入到新表里面 select into
- 关于父子级数据的sql复制处理
- SQL语句:复制表结构以及同时插入多条数据
- 关于 sql 多表 外键 插入数据 提示 fk_0002 的 问题
- 14.插入数据、复制数据--SQL
- 关于SqL Server Excel 导入数据库 (或DataTable/DataGridView)避免数据插入重复语句
- 复制文件时,如何显示进度条(使用BlockRead函数读取数据,并插入application.ProcessMessages)
- sql 2005 不同数据库的数据表复制
- 关于sql查询字符char类型数据的条件使用
- sql 当中的 count 用法 及两个库复制数据时该列不能为空
- sql语句插入的数据中含有单引号怎么办?
- SQL强制为标识列插入数据
- 关于select和insert,将一个表中的部分数据复制到另一个表中
- pl/sql 插入超过4000的blob数据
- 建立表格示例的SQL表及插入数据语法