我有一个数据仓库,我们每晚重新加载需要两个小时。现在我们截断表并从我们的实时Microsoft Dynamics 2000服务器重新加载它,该服务器分别拆分公司表。
例如,我们有公司ABC,DEF和GHI,我们有表Customers
。我的生产服务器中有三个单独的表,名为ABC_ $ Customers,DEF_ $ Customers和GHI_ $ Customers。
在数据仓库表中,我只想要一个Customers表,它是ABC_ $ Customers,DEF_ $ Customers和GHI_ $ Customers的联合。
目前,我们使用游标循环遍历公司名称并为公司插入表格,然后为我们所有的表格获取下一家公司。
当我们没有截断表,并使用插入/更新的连接时,它很快填充了事务日志。
你有什么建议更换游标?我已经研究过并发现了SET和CTE,但由于动态表名称,我不确定它是否可行。
其中一个游标的示例:
use DataWarehouse
truncate table Customers
declare @company varchar(250)
declare @companyID varchar(50)
declare @sql nvarchar(4000)
DECLARE Company_cursor CURSOR FOR
SELECT CompanyID, CompanyName
FROM CompanyNames
OPEN Company_cursor
FETCH NEXT FROM Company_cursor
INTO @companyID, @company
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = 'Insert Into Customers(CompanyID, CustomerID, CustomerName)
'+ ' select ' + Cast(@companyID as varchar(10))
+ ',[CustomerID],[CustomerName] from [Database].dbo.[' + @company + '$Customers] '
exec sp_executesql @sql
FETCH NEXT FROM Company_cursor
INTO @companyID, @company
END
CLOSE Copmany_cursor
DEALLOCATE Copmany_cursor
答案 0 :(得分:0)
如果您使用动态表名,您的代码似乎是合理的。
您可能已经与系统表进行了连接,以便将单个查询中的所有公司名称检索到一个巨大的动态SQL语句中然后运行此语句,但我怀疑它会产生很大的不同。
游标在这里是完全合理的。