替换SQL Server 2008 R2中的游标

时间:2014-06-30 14:04:02

标签: sql tsql sql-server-2008-r2 cursor data-warehouse

我有一个数据仓库,我们每晚重新加载需要两个小时。现在我们截断表并从我们的实时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

1 个答案:

答案 0 :(得分:0)

如果您使用动态表名,您的代码似乎是合理的。

您可能已经与系统表进行了连接,以便将单个查询中的所有公司名称检索到一个巨大的动态SQL语句中然后运行此语句,但我怀疑它会产生很大的不同。

游标在这里是完全合理的。