2017-05-30 184 views
0

我需要从表A到表B(基本上从主表到各自的历史表)复制/插入具有某个where子句的所有值。使用结果(从Info_schema中选择的列)选择查询

我不想指定列名称,因为我想创建一个通用的方法,它将能够用于所有需要提取的表格。

不幸的是,表A中的属性并不总是与tableB中的属性相同,所以我不能在TableA中使用select * into #temp,然后从#temp插入到tableB中。 Plus TableB具有通用的3 sys列,我们为审计目的而生成这些列。

我的想法是使用Info模式来获取列名。然后以某种方式使用结果来获取查询表中的所有值并将其添加到通用sys列的顶部。有可能吗?

我通过使用Info架构获得了列名。

Select 
     COLUMN_NAME 
FROM INFORMATION_SCHEMA.columns 
where TABLE_NAME = 'TableA' 

的SYS列:

sys_date=Getdate() 
,sys_flag='1' 
,sys_name=SYSTEM_USER 
+0

2表总是有相同的名称,数据类型和值的列,期望的序数位置。所有附加列对于所有表都是相同的? –

+1

对于初学者.... mysql或sql server?它们不是同一件事。一旦你决定使用哪个DBMS,你需要澄清这个问题。我不清楚你想要做什么。 –

+0

@RohitKumar,是的,两个表具有相同的数据类型。两者之间的唯一区别在于第二个没有约束并且有一些额外的列。 –

回答

0

使用动态查询的SQL Server 请相应地更改表名称。

Declare @Table_Name varchar(50) 
SET @Table_Name ='LoginMst' 
Declare @Query varchar(8000) 
Declare @ColumnNames varchar (8000) 
set @ColumnNames = '' 
    select @ColumnNames = 
    case when @ColumnNames = '' 
    then column_name 
    else @ColumnNames + coalesce(',' + column_name, '') 
    end 
    from information_schema.columns where [email protected]_Name 

SET @Query='insert into '[email protected]_Name+'_Log ('[email protected]+',sys_date,sys_flag,sys_name'+') 
select '[email protected]+',Getdate(),''1'',SYSTEM_USER from '+ 'LoginMst' 
--print @Query 
Exec(@Query) 

您将需要迭代所有希望进行备份的表。您还需要添加where子句。

+0

,谢谢。这是工作。正是我需要的。 –

+0

@ valerie-kozel我的荣幸,它符合您的目的,如果您可以将答案标记为已接受,那么也可以帮助其他人寻找类似的问题。 –