2009-02-10 152 views
2

我有一個vb.net函數,它根據傳入函數的參數創建幾個存儲過程。如何使用SQL創建多個存儲過程

我想將這個vb.Net移動到一個單獨的SQL文件(出於維護的原因),但我不知道如何在不創建7個單獨的存儲過程的情況下在SQL中重新創建它。

我創建了總共20個存儲過程,我並不想在SQL文件中創建這麼多,因爲維護將是一場噩夢。我想知道如果有我如何做它VB.Net下面類似的解決方案:

Private Sub CreateStoredProcedures() 

     CreateSP("SummaryNone", "YEAR([sale].[DateTime])") 
     CreateSP("SummaryUser", "[sale].[User]") 
     CreateSP("Summarysale", "[sale].[sale]") 
     CreateSP("SummaryBatch", "[sale].[Batch]") 
     CreateSP("SummaryDay", "dbo.FormatDateTime([sale].[DateTime], 'yyyy-mm-dd')") 
     CreateSP("SummaryMonth", "dbo.FormatDateTime(dbo.DateSerial(YEAR([sale].[DateTime]), MONTH([sale].[DateTime]), 1), 'yyyy-mm-dd')") 
     CreateSP("SummaryYear", "Year([sale].[DateTime])") 

     Return 
    End Sub 


    Private Sub CreateSP(ByVal vName As String, ByVal vGroup As String) 

     Dim CommandText As String = _ 
         "CREATE PROCEDURE " & vName _ 
         & " @StartDate varchar(50)," _ 
         & " @EndDate varchar(50)" _ 
         & " AS " _ 
         & " SELECT " & vGroup & "     AS GroupField," _ 
         & " Sum([Project].[NumProject])    AS TotalProject," _ 
         & " Sum([Project].[Title])     AS SumTitle," _ 
         & " Sum([Project].[Duration])    AS SumDuration," _ 
         & " Sum([Project].[Info])    AS SumInfo," _ 
         & " Sum([Customer].[NumCustomer]) AS TotalNumCustomer," _ 
         & " Sum([Orders].[NumOrders]) AS TotalNumOrders," _ 
         & " Sum([OrderInspection].[NumInspects])   AS TotalNumInspects," _ 
         & " Sum([OrderInspection].[NumFails])    AS TotalNumFails," _ 
         & " Sum([CustomerInspection].[NumInspects]) AS TotalNumCustomerInspectionInspects," _ 
         & " Sum([CustomerInspection].[NumFails])  AS TotalNumCustomerInspectionFails," _ 
         & " Sum([Measurements].[NumMeasurements]) AS TotalNumMeasurementss" _ 
         & " FROM ((((((sale LEFT JOIN Project ON [sale].[saleId]=[Project].[saleId])" _ 
          & " LEFT JOIN Customer ON [Project].[PrintId]=[Customer].[PrintId])" _ 
          & " LEFT JOIN Orders ON [Project].[PrintId]=[Orders].[PrintId])" _ 
          & " LEFT JOIN OrderInspection  ON [Project].[PrintId]=[OrderInspection].[PrintId])" _ 
          & " LEFT JOIN CustomerInspection ON [Project].[PrintId]=[CustomerInspection].[PrintId])" _ 
          & " LEFT JOIN Measurements ON [Project].[PrintId]=[Measurements].[PrintId])" _ 
         & " WHERE [sale].[DateTime] BETWEEN dbo.FormatDateTime((@StartDate), 'yyyy-mm-dd')" _ 
         & " AND dbo.FormatDateTime((@Enddate),'yyyy-mm-dd')" _ 
         & " GROUP BY " & vGroup & "" _ 
         & " ORDER BY " & vGroup & ";" 

     SqlExecuteNonQuery(CommandText) 

     return 
    End Sub 

我期待着您的意見和答覆。

謝謝

回答

3

您可以將模板作爲.NET DLL中的嵌入資源存儲在文本文件中。爲您的動態位設置一些佔位符。這將使您當前的解決方案更易於維護。然後你從DLL加載流並保持你的當前實現。

編輯文本文件比嵌入在C#文件中的大塊SQL更容易。

如果將其移到單個proc中,您可能會收到性能問題,但您可能會對此感到滿意,但請記住,proc也會有一些維護問題。我們通常喜歡避免存儲過程中的動態SQL。而7路IF分支是維修的噩夢。

2

我會建議您創建一個單一的存儲過程,你打電話。

然後使用動態SQL構建適用於單個存儲過程中使用的select語句。

有意義嗎?

+0

謝謝,它確實有道理。我會考慮這樣做。 – Belliez 2009-02-10 09:16:23

+0

好東西,讓我們知道如果你需要進一步的援助。 – 2009-02-10 11:43:16

2

您可以創建一個名爲Summary的存儲過程,然後將名稱和列作爲附加參數傳遞。然後你創建動態SQL並執行它。

1

在我看來,動態構建語句並執行它(在T-SQL中)是最好的選擇。 如果所有的pissoble都可以的話,我也可以避免在代碼中創建存儲過程。存儲porcs最大的好處是他們的執行計劃被緩存在服務器上。如果你丟棄並重新創建它們,那麼這些計劃通常會被刪除,因爲proc被刪除。

1

SP的優勢在於它是預編譯的,並且已經創建了執行計劃,同時牢記創建SP時出現的數據。

因此,動態SQL會有性能影響,因爲SQL Server無法事先發現哪些索引要使用(或甚至是否使用它們)。由於當前您在之後創建了sp ,所以查詢計劃已正確創建。切換到動態SQL後,情況並非如此。

你也可以創建一個sp,如果然後條件來照顧各種情況。但是,如果稍後添加更多參數,則需要進行維護。