【问题标题】:How to create several stored procedure using SQL如何使用 SQL 创建多个存储过程
【发布时间】:2009-02-10 08:54:26
【问题描述】:

我有一个 vb.net 函数,它根据传递给函数的参数创建多个存储过程。

我想将此 vb.Net 移动到单个 SQL 文件中(出于维护原因),但我不确定如何在 SQL 中重新创建它而不创建 7 个单独的存储过程。

我总共创建了 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

我期待您的 cmets 和回复。

谢谢

【问题讨论】:

    标签: sql sql-server vb.net sql-server-2005 tsql


    【解决方案1】:

    您可以将模板存储在文本文件中作为 .NET DLL 中的嵌入式资源。为您的动态位设置一些占位符。这将使您当前的解决方案更易于维护。然后从 DLL 加载流并保留当前的实现。

    编辑文本文件比嵌入在 C# 文件中的大量 SQL 更容易。

    如果将其移至单个 proc,您可能会受到性能影响,您可能对此感到满意,但请记住,proc 也会有一些维护问题。我们通常喜欢在存储过程中避免使用动态 SQL。而 7 路 IF 分支是维护的噩梦。

    【讨论】:

      【解决方案2】:

      您可以创建一个名为 Summary 的存储过程,然后将名称和列作为附加参数传入。然后创建动态 SQL 并执行它。

      【讨论】:

      • 我会考虑这样做。感谢您为我指明正确的方向
      【解决方案3】:

      我建议您创建一个您调用的存储过程。

      然后使用动态SQL构建适当的SELECT语句以在单个存储过程中使用。

      有意义吗?

      【讨论】:

      • 谢谢,确实有道理。我会考虑这样做。
      • 好东西,如果您需要进一步的帮助,请告诉我们。
      【解决方案4】:

      在我看来,动态构建语句然后执行它(在 T-SQL 中)是您最好的选择。 如果一切顺利,我也不会在代码中创建存储过程。存储 porcs 的最大优势是它们的执行计划缓存在服务器上。如果您经常删除并重新创建它们,那么这些计划会因为 proc 被删除而被删除。

      【讨论】:

        【解决方案5】:

        SP 的优势在于它是预编译的,并且已经创建了执行计划,同时牢记创建 SP 时存在的数据。

        所以动态 SQL 会影响性能,因为 sql server 无法事先找出要使用的索引(或者甚至不使用它们)。由于当前您正在创建 sp after 替换,因此正确创建了查询计划。切换到动态sql后就不会这样了。

        您还可以使用 if then 条件创建一个 sp 来处理各种情况。但是,这需要维护,以防以后添加更多参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-16
          • 1970-01-01
          相关资源
          最近更新 更多