2015-07-02 25 views
1

我在我的SQL Server數據庫中有很多存儲過程,其中約90%返回一個表。該數據庫已經創建用於存儲C#項目的數據。如何過濾SQL Server中所有現有存儲過程的輸出?

在一個場景中,從應用程序端調用過程時,我希望能夠應用一些通用過濾器來處理輸出。例如,獲得輸出的前100條記錄。這個過濾器應該爲每個過程完成,所以我構建了一個單一的通用靜態類,它只是在我的應用程序中調用過程的一點。然後我過濾每個輸出並返回。

確定這項工作對我來說,但它效率不高,因爲數據庫返回冗餘行,它們將在應用程序端進行過濾。

我決定改進這項工作。我正在考慮遷移過濾器以應用於數據庫端,但不修改任何現有的過程。

我的想法是,我在數據庫中創建一個RunnerProcedure,它獲取過程名稱及其參數,運行它,應用我的常規過濾器並最終返回結果輸出。

比如我一般的過濾器可能是:

select top 100 * from output 

因此,在這種方法中,我要實現這樣的事情:

CREATE PROCEDURE RunnerProcedure 
AS 
    @ProcedureName nvarchar(max), 
    @ProcedureParameters dbo.ProcedureParametersTableType READONLY 
BEGIN 
... 
// @output = execute @ProcedureName with @ProcedureParameters 
Select top 100 * from (@output) 
I don't have any idea in implementation! please help. 
... 
END 

我跟我的想法,解釋正是我想要的。如果有可能,請讓我知道如何。請完成它。或者如果這是不可能的,請讓我知道你的建議。

謝謝

回答

2

去一個stored procedure created in managed code

構建一個包含已有代碼的c#庫,並將其放在服務器上,然後將其存儲在存儲過程中,如鏈接的msdn頁面中所述。

來自應用程序的所有調用都將通過'c#存儲過程'進行路由,該過程將過濾服務器上的記錄。

從負載角度來看,我沒有看到很大的優勢,因爲無論如何都會生成完整的記錄集,而且服務器現在負責輸出剪切,但是網絡上傳輸的數據量會減少。

+0

它看起來不錯的主意的東西,讓我查一下:) –

1

你可以試試下面

SELECT * INTO #temptable 
FROM OPENROWSET('SQLNCLI', 'Server=loclhost;Trusted_Connection=yes;', 'exec procedurename') 

SELECT TOP 100 * FROM #temptable 
相關問題