zoukankan      html  css  js  c++  java
  • 如何用临时表代替游标进行表记录的拷贝

    在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

     

  • 相关阅读:
    软件开发过程中应当遵守的原则
    企业架构是什么?
    软件工程的精髓
    PHP获取自然周列表,周开始结束日期,月开始结束时间方法类
    JS替换textarea里的回车换行
    PHP连接PGSQL
    PT与PX的区别
    JQuery 翻页小记
    PHP中替换textarea时的回车换行
    HTML5 CanvasOreilly.Canvas.Pocket.Reference (4)
  • 原文地址:https://www.cnblogs.com/davidgu/p/1718755.html
Copyright © 2011-2022 走看看