2015-07-13 23 views
0

我有一個場景,其中一個SP與動態查詢一起實現,我需要刪除該實現由於性能因素。這是一種導入功能,我們最初將我們的數據從excel插入臨時表,並從那裏驗證我們的數據,將數據保存到另一個臨時表中。如果所有驗證都通過,則將數據插入物理表中。什麼可能的方法來替換SQL SERVER中的動態查詢

登臺表可以有四種類別的數據(FParty,SParty,TParty,Owner),這些數據是從excel傳遞到一次登臺的。而這些類別的物理表包含不同數量的列。因此在運行時只有我們能夠知道數據的類別,然後我們必須相應地創建臨時表來驗證數據。

截至目前,我們正在使用動態查詢在運行時根據類別創建臨時表。程序如下:

CREATE procedure [dbo].[GetData_Into_Temptbl] (    
    ,@CategoryType varchar(50) -- FParty, SParty, TParty, Owner) 
BEGIN 
declare Category cursor for 
select Fields from dbo.StagingTable where CategoryName= @CategoryType 

Open Category 
Fetch Next from Category into @Field 


while @@Fetch_status = 0  
begin 

set @FieldsToCreatetempTable = @ FieldsToCreatetempTable + ',' + @Field 

Fetch Next from Category into @Field 
end 
close Category 
deallocate Category 
set @tblTemp = 'insert into #TempTableData ('[email protected]+')' 
Exec(@tblTemp) 
END 

上面的代碼工作正常,但需要替換過程的動態性質。請提出任何概念。

+1

你的性能問題更可能是由於光標少,由於動態SQL。您可能需要考慮刪除光標 – Raj

+0

我覺得問題在於您一遍又一遍地調用此過程 - 並且逐行處理,而不是其中存在動態SQL。 –

+0

感謝Raj提出這個問題,但我被要求刪除動態查詢,不管光標是什麼:( – PS078

回答

0

一個表/光標構建逗號分隔的列列表是矯枉過正的,就像主要的矯枉過正。

你可以考慮平倉邏輯分爲4個簡單的存儲過程,它可以基於某些邏輯調用,如categoryType

IF @categoryType = 'FParty' 
BEGIN 
    exec dbo.InsertFPartyTempData 
END 
ELSE IF @categoryType = 'SParty' 
BEGIN 
    exec dbo.InsertSPartyTempData 
END 
... // etc 
+0

謝謝Jamiec,這對我的問題來說看起來是一個簡單而好的方法。 – PS078

相關問題