• T-SQL——关于表数据的复制插入


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

    作者:shanzm
    欢迎交流,欢迎指教!
  • 相关阅读:
    MySQL——字符串拆分(含分隔符的字符串截取)
    一列数据组合成字符串并用逗号隔开
    web最大化,最小化文字错位的问题
    Esxi虚拟机安装Ros+Openwrt软路由双系统简单分享(踩到的坑,很大的坑)
    跟着老司机免费申请一个域名去!
    logging模块
    os.rename 和os.replace
    装饰器详解
    python if not
    globals和locals的区别
  • 原文地址:https://www.cnblogs.com/shanzhiming/p/15362907.html
Copyright © 2020-2023  润新知