none
求问存储过程问题.. RRS feed

  • 问题

  • 假设有2个表,tb_AA,tb_BB,怎么写存储过程才能做到从第2个表中选取出第1个表所含有的字段然后插入第一个表呢..主键是tb_BB中的ID,tb_AA也是ID
    2010年3月18日 8:59

答案

  • 假设有2个表,tb_AA,tb_BB,怎么写存储过程才能做到从第2个表中选取出第1个表所含有的字段然后插入第一个表呢..主键是tb_BB中的ID,tb_AA也是ID
    use Tempdb
    go
    create table tb_AA(ID int Primary key,Code nvarchar(20),Num int)
    create table tb_BB(ID int Primary key,Code nvarchar(20),Num int,Num2 int)
    
    
    create procedure P_TableCopy
    (
        @Tab1 sysname,    --tb_AA
        @Tab2 sysname    --tb_BB
    )
    as
    begin
        declare @s nvarchar(2000)
        set @s=''
        select @s=@s+','+a.Name
        from syscolumns a,syscolumns b
        where a.ID=object_id(@Tab1) and b.ID=object_id(@Tab2) and a.Name=b.Name
    
        set  @s='insert '+@Tab1+'('+stuff(@s,1,1,'')+') select '+stuff(@s,1,1,'')+' from '+@Tab2+' as a where not exists(select 1 from '+@Tab1+' where ID=a.ID)'
    
        exec(@s)
    
    end
    go
    生成的語句格式為
    insert tb_AA(ID,Code,Num)
    select ID,Code,Num
    from tb_BB as a
    where not exists(select 1 from tb_AA where ID=a.ID)


    ROY WU(吳熹)
    • 已标记为答案 FrostX 2010年3月19日 5:13
    • 已标记为答案 FrostX 2010年3月19日 5:13
    2010年3月18日 9:28
    版主
  • 动态sql, 从 syscolumns 中可以取出表的字段列表, 通过这个拼出查询语句就行了. 具体的就是1楼的存储过程.

     

    • 已标记为答案 FrostX 2010年3月19日 5:13
    2010年3月19日 4:38

全部回复

  • 假设有2个表,tb_AA,tb_BB,怎么写存储过程才能做到从第2个表中选取出第1个表所含有的字段然后插入第一个表呢..主键是tb_BB中的ID,tb_AA也是ID
    use Tempdb
    go
    create table tb_AA(ID int Primary key,Code nvarchar(20),Num int)
    create table tb_BB(ID int Primary key,Code nvarchar(20),Num int,Num2 int)
    
    
    create procedure P_TableCopy
    (
        @Tab1 sysname,    --tb_AA
        @Tab2 sysname    --tb_BB
    )
    as
    begin
        declare @s nvarchar(2000)
        set @s=''
        select @s=@s+','+a.Name
        from syscolumns a,syscolumns b
        where a.ID=object_id(@Tab1) and b.ID=object_id(@Tab2) and a.Name=b.Name
    
        set  @s='insert '+@Tab1+'('+stuff(@s,1,1,'')+') select '+stuff(@s,1,1,'')+' from '+@Tab2+' as a where not exists(select 1 from '+@Tab1+' where ID=a.ID)'
    
        exec(@s)
    
    end
    go
    生成的語句格式為
    insert tb_AA(ID,Code,Num)
    select ID,Code,Num
    from tb_BB as a
    where not exists(select 1 from tb_AA where ID=a.ID)


    ROY WU(吳熹)
    • 已标记为答案 FrostX 2010年3月19日 5:13
    • 已标记为答案 FrostX 2010年3月19日 5:13
    2010年3月18日 9:28
    版主
  • 上面的看不太懂..
    看生成的语句格式的话
    假如tb_AA中的字段比较多该怎么做呢..,比如tb_AA可能有7个字段,tb_BB有14个,其中7个是tb_AA中也有的,那这样的话写插入的时候必须把这7个字段全写在insert tb_AA()的括号中么..有没有其他的办法呢..

    2010年3月18日 9:50
  • 动态sql, 从 syscolumns 中可以取出表的字段列表, 通过这个拼出查询语句就行了. 具体的就是1楼的存储过程.

     

    • 已标记为答案 FrostX 2010年3月19日 5:13
    2010年3月19日 4:38
  • 好像明白了..万分感谢!
    2010年3月19日 5:12