我这里有个表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表的配置任意添加,有什么办法解决吗?不知道这样说是否清楚,求指点
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表的配置任意添加,有什么办法解决吗?不知道这样说是否清楚,求指点
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)
-- 输入参数@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)
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)
如果你有一张表能存储这个表字段也行。一个例子,楼主可以自己开放思路
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)
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表的字段及字段来源表