簡體   English   中英

替換SQL Server 2008 R2中的游標

[英]Replace cursor in SQL Server 2008 R2

我有一個數據倉庫,我們每晚都需要重新加載,這需要兩個小時。 現在,我們截斷表並從我們的實時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語句中,然后運行該語句,但是我懷疑這樣做會有很大不同。

游標在這里是完全合理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM