我这里有个表A,数据来自于三张表B,C,D,表字段需要灵活配置(就是能根据需要添加),然后通过配置好的字段从三张表中获得数据insert到A中的对应字段,用存储过程怎么实现?求指点insert into A(1,2,3,...)
select B.1,C.2,D.3
from B,C,D
where B.cust_id=C.customer_id
C.serial_id=D.contract_id就是类似于上面这样一个逻辑现在的问题是,在存储过程中,输入参数(@IN_P)对应的A表的1,2,3。。字段都是设置固定的,没法根据前面A表的配置任意添加,有什么办法解决吗?不知道这样说是否清楚,求指点

解决方案 »

  1.   

    这样的问题动态处理。结合系统表确定你的需要insert的字段,拼接动态语句
      

  2.   

    declare @a1 varchar(10)
    declare @a2 varchar(10)
    declare @a3 varchar(10)
    SET @A1='ID'
    SET @A2='b'
    SET @A3='c'
    DECLARE @TEST VARCHAR(MAX)
    SET @TEST='INSERT INTO TEST('+@A1+','+@A2+','+@a3+') select a.'+@A1+',a.'+@A2+','+@A3+' from test1 a'
    PRINT @TEST
    EXEC (@TEST)
      

  3.   


    -- 输入参数@IN_P
    declare @IN_P varchar(2000),@sql varchar(6000)select @IN_P='1,2,3'select @sql='insert into A('+@IN_P
    +') select '+@IN_P
    +'from B,C,D
    where B.cust_id=C.customer_id
    C.serial_id=D.contract_id'exec(@sql)
      

  4.   

    create table t1(  
      id bigint, book nvarchar(30))
    insert into t1 values(1, '英语书')
    insert into t1 values(2, '语文书')
    create table t2( 
      id bigint, bookid bigint, createdate char(10))
    insert into t2 values(  1, 1, '2012-05-12')
    insert into t2 values(  2, 2, '2012-05-17')create table t3( 
      id bigint,bookid bigint, author nvarchar(30))
      insert into t3 values(1 ,1, '张三')
     insert into t3 values( 2, 2, '李四')create table t4(  
      id bigint,bookid bigint, publish nvarchar(30))
     insert into t4 values(  1, 1, '清华出版社')create table A
    (id bigint identity(1,1) primary key,book nvarchar(30),createdate nvarchar(30),
    author nvarchar(30),publish nvarchar(30)
    )create proc proc_testas
    declare @sql varchar(max)
    declare @columns1 varchar(100)
    declare @sql2 varchar(max)
    set @sql=''
    declare c_cur cursor
    for select name from syscolumns a where typestat=2 and exists(select 1 from sysobjects where name='A' and a.id=id)
    open c_cur
    fetch next from c_cur into @columns1 
    while @@fetch_status=0
    begin
          set @sql=@sql+','+@columns1+'' 
    fetch next from c_cur into @columns1
    end
    close c_cur
    deallocate c_cur
    set @sql=right(@sql,len(@sql)-1)
    set @sql2='insert into A('+@sql+') select '+@sql+' from t1 a left join t3 b on a.id=b.bookid left join t4 c on a.id=c.bookid left join t2 d on a.id=d.bookid'
    print @sql2
    exec (@sql2)
    如果你有一张表能存储这个表字段也行。一个例子,楼主可以自己开放思路
      

  5.   

    SQL codedeclare @a1 varchar(10)
    declare @a2 varchar(10)
    declare @a3 varchar(10)
    SET @A1='ID'
    SET @A2='b'
    SET @A3='c'
    DECLARE @TEST VARCHAR(MAX)
    SET @TEST='INSERT INTO TEST('+@A1+','+@A2+','+@a3+') select a.'+@A1+',a.'+@A2+','+@A3+' from test1 a'
    PRINT @TEST
    EXEC (@TEST)
      

  6.   

    create table t1(  
      id bigint, book nvarchar(30))
    insert into t1 values(1, '英语书')
    insert into t1 values(2, '语文书')
    create table t2( 
      id bigint, bookid bigint, createdate char(10))
    insert into t2 values(  1, 1, '2012-05-12')
    insert into t2 values(  2, 2, '2012-05-17')create table t3( 
      id bigint,bookid bigint, author nvarchar(30))
      insert into t3 values(1 ,1, '张三')
     insert into t3 values( 2, 2, '李四')create table t4(  
      id bigint,bookid bigint, publish nvarchar(30))
     insert into t4 values(  1, 1, '清华出版社')create table A
    (id bigint identity(1,1) primary key,book nvarchar(30),createdate nvarchar(30),
    author nvarchar(30),publish nvarchar(30)
    )
    create table tablecolumns
    (id int identity(1,1), name varchar(30),sourcetable varchar(30),isvalues bit)
    insert into tablecolumns (name,sourcetable,isvalues) select name,'',0 from syscolumns a where  exists(select 1 from sysobjects where name='A' and a.id=id)drop proc proc_test
    create proc proc_test
    as
    declare @sql varchar(max)
    declare @columns1 varchar(100)
    declare @columns2 varchar(100)
    declare @sql2 varchar(max)
    declare @sql3 varchar(max)
    declare @sql1 varchar(max)
    set @sql=''
    set @sql1=''
    declare c_cur cursor
    for select name,sourcetable from tablecolumns where isvalues=1
    open c_cur
    fetch next from c_cur into @columns1,@columns2 
    while @@fetch_status=0
    begin
          set @sql=@sql+','+@columns1+'' 
          set @sql1=@sql1+','+@columns2+'.'+@columns1+'' fetch next from c_cur into @columns1,@columns2 
    end
    close c_cur
    deallocate c_cur
    set @sql=right(@sql,len(@sql)-1)
    set @sql1=right(@sql1,len(@sql1)-1)
    set @sql2='insert into A('+@sql+') select '+@sql1+' from t1  left join t3  on t1.id=t3.bookid left join t4  on t1.id=t4.bookid left join t2  on t1.id=t2.bookid'
    print @sql2
    exec (@sql2)这个就是系统里面有一张表,能够确定A表的字段及字段来源表