2011-12-16 38 views
0

我有一个有很多列的关系表。 (import_table) 我试图将所有这些数据插入到面向对象的数据库中。从关系表插入到面向对象表的快速方法

面向对象数据库有表:

#table (tableId, name) 
#row (rowId, table_fk) 
#column(colId, table_fk, col_name) 
#value(valueId, col_fk, row_fk) 

到目前为止,我已经创建了一个将读取import_table INFORMATION_SCHEMA正确插入表和列到面向对象的结构的过程。 然后,我将import_data复制到带有额外标识列的临时表中,以获取行标识符。然后遍历所有行,使用内部循环遍历每列,并执行插入公关。柱。 喜欢这个:

SELECT ROWID=IDENTITY(INT, 1, 1), * INTO #TEST 
FROM import_table 

DECLARE @COUNTER INT = 1 
WHILE @COUNTER <= (SELECT COUNT(*) FROM #TEST) 
BEGIN 
    INSERT INTO #ROW (ROWID, TABLE_FK) VALUES(@COUNTER, 1) 
    DECLARE @COLUMNCOUNTER INT = 1 
    WHILE @COLUMNCOUNTER <= (SELECT COUNT(*) FROM #COLUMN WHERE TABLE_FK = 1) 
    BEGIN 
     DECLARE @COLNAME NVARCHAR(254) = select col_name from #column where table_fk = 1 and rowid = @columnCounter 
     DECLARE @INSERTSQL NVARCHAR(1000) = 'insert into #value (column_fk, row_fk, value) select '+cast(@columnCounter as nvarchar(20))', '+cast(@counter as nvarchar(20))+', ' + @colName+' from #test where rowId = '+cast(@counter as nvarchar20)) 
     exec (@insertSQL) 
     set @columncounter = @columncounter +1 
    end 
    set @counter = @counter +1 
end 

这个工程,但它非常缓慢。 有关如何加快速度的建议?

+0

只是增加了一些。希望它有帮助 – user829237 2011-12-16 12:35:06

+2

我怀疑你滥用术语“关系”和“面向对象”。 – onedaywhen 2011-12-16 15:24:44

回答

0

重新设计数据库。

你有什么是属性不好的类型的表。这些是已知的折衷设置,并猜测什么 - 速度是他们不好的项目。

你可能会在C#中做事情更快,外面再流插件回。

+0

对不起。但是没有办法。这些表格必须被使用,因为它们是由于管道下方的其他要求。但感谢您的意见。 – user829237 2011-12-16 13:15:55

0

的一种方式,以加快你的代码来包装你插入的交易(占外循环迭代也许一个交易? )。如果存在大量插入操作,那么将每个代码放入单独的事务中,如代码所示,将会非常慢。