[英]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.