• 如何用临时表代替游标进行表记录的拷贝


    在sql中,有时候游标并不能实现所有的循环操作,比如当双重循环时,内层重复定义动态游标就是sql语法所不允许的.

    下面介绍一种利用临时表替代游标的方法.

    sql代码
    use test 
    go 

    -- 假设有个table, TA, TB 
    create table TA 

            id 
    uniqueidentifier primary key
            name 
    varchar(10), 
            age 
    int 

    go 

    -- 插入一些测试数据 
    insert TA (id, name, age) values ('675BEB41-E5DC-4688-B317-CA0BD5A58961''张三'20
    insert TA (id, name, age) values ('EF6358BE-0658-488B-94D7-38507782C8DE''李四'15
    go 

    create table TB 

            id 
    uniqueidentifier primary key
            TA_id 
    uniqueidentifier foreign key references TA(id), 
            claim 
    decimal(18,2), 
            claim_date 
    datetime not null default(getdate()) 

    go 

    -- 插入一些这些人的测试报销数据 
    insert TB (id, TA_id, claim, claim_date) values (newid(), '675BEB41-E5DC-4688-B317-CA0BD5A58961'300'2010-03-01'
    insert TB (id, TA_id, claim, claim_date) values (newid(), '675BEB41-E5DC-4688-B317-CA0BD5A58961'150'2010-04-05'

    insert TB (id, TA_id, claim, claim_date) values (newid(), 'EF6358BE-0658-488B-94D7-38507782C8DE'50'2010-02-23'
    insert TB (id, TA_id, claim, claim_date) values (newid(), 'EF6358BE-0658-488B-94D7-38507782C8DE'350'2010-03-15'
    insert TB (id, TA_id, claim, claim_date) values (newid(), 'EF6358BE-0658-488B-94D7-38507782C8DE'412'2010-04-10'

    -- 现在要复制所有age > 10 的数据及其附表数据。 
    select * into #ta_temp from TA 
    -- 假设有某个条件: 
    where age > 10 
    go 

    -- 对每个#ta_temp 里的记录,生成一个新的主键 
    alter table #ta_temp 
    add new_key uniqueidentifier not null default(newid()) 
    go 

    -- 测试一下: 
    --
    select * from #ta_temp 

    -- 现在插入要拷贝的这些主表记录 
    insert TA (id, name, age) 
    select new_key, name + '拷贝', age 
    from #ta_temp 

    -- 现在对#ta_temp 中的每条主表记录找到对应的附表记录, 
    --
     并对应到新主键,插入从表 
    insert TB (id, TA_id, claim, claim_date) 
    select 
            
    newid(), 
            b.new_key, 
            a.claim, 
            a.claim_date 
    from TB a inner join #ta_temp b 
            
    on a.TA_id = b.id 
    go 

    -- 清理现场 
    drop table #ta_temp 
    go 

    -- 测试结果: 
    select * from TA 
    select * from TB 
    go

     

  • 相关阅读:
    MVC模式简介
    UEditor插入表格没有边框但有间距
    MVC准备前基础知识
    如何关闭ie9烦人的提示信息?
    javaScript中利用ActiveXObject来创建FileSystemObject操作文件
    win7下IIS安装与配置运行网站
    javascript函数
    减小SSN影响
    EMC (电磁兼容性)
    电源完整性设计
  • 原文地址:https://www.cnblogs.com/davidgu/p/1718755.html
Copyright © 2020-2023  润新知