【问题标题】:Replace cursor in SQL Server 2008 R2在 SQL Server 2008 R2 中替换光标
【发布时间】:2014-08-20 22:22:48
【问题描述】:

我有一个数据仓库,我们每晚都会重新加载,这需要两个小时。现在我们截断表并从我们的实时 Microsoft Dynamics 2000 服务器重新加载它,该服务器分别拆分出公司表。

例如,我们有公司 ABC、DEF 和 GHI,我们有表 Customers。我在生产服务器中有三个单独的表,分别称为 ABC_$Customers、DEF_$Customers 和 GHI_$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

【问题讨论】:

  • 为什么投反对票?这是一个合理的问题,有明确的问题。
  • 在这种情况下使用游标似乎是合理的。您正在通过动态 SQL 对最终表进行批量插入。光标仅用于控制正在使用的元数据。

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


【解决方案1】:

如果你使用动态表名,你的代码看起来是合理的。

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

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

【讨论】:

  • 谢谢。我希望有一种更快的方法,但据我所知,我继承了一个野兽,至少当我们有那些丑陋的单独表格时,试图改善负载不会以光标为中心。
  • @Alwaysariyana:好吧,如果您真的讨厌游标,您可以在单个查询中构建此语句。但是这有一些限制,游标在这里真的很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多