志铭-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. 参考

最新文章

  1. STDIN(0), STDOUT(1), STDERR(2), 2 &gt; &amp;1
  2. 360和QQ大战之我见
  3. Cloudservice程序设置Idle timeout
  4. WPF之MVVM(Step4)&mdash;&mdash;使用Prism(2)
  5. 2003服务器断开rdp后会自动注销。
  6. 什么是REST架构(转)
  7. XMPP登录应用
  8. emmet插件的导入与实用
  9. poj2407---欧拉函数应用
  10. [O]打印时闪退问题
  11. SQL优化实用方法
  12. Spock - Document -01- introduction &amp; Getting Started
  13. SpringMVC Controller之间的重定向和转发
  14. 使用solr进行配置文件
  15. Java静态成员与实例成员
  16. 06 Zabbix分布式监控和主被动模式
  17. 第四章,java面向对象特性
  18. 有用的SAP System Administration T-CODE
  19. Codeforces 294D - Shaass and Painter Robot
  20. Linux上查看造成IO高负载的进程

热门文章

  1. chmod u+s是什么意思
  2. 《深入理解java虚拟机》第3版笔记3
  3. Hadoop分布式资源管理器Yarn、MR运行机制剖析
  4. vue 优化hash持久化缓存
  5. spring动态切换数据源(一)
  6. Linux中MySQL的安装以及卸载
  7. Shell脚本一键部署——源码编译安装MySQL及自动补全工具
  8. SVN无法查看最近日志和提交记录
  9. .Net性能调优-ArrayPool
  10. linux 档案权限篇之一