Как создать несколько хранимых процедур с использованием SQL - PullRequest
2 голосов
/ 10 февраля 2009

У меня есть функция 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

С нетерпением жду ваших комментариев и ответов.

Спасибо

Ответы [ 5 ]

3 голосов
/ 10 февраля 2009

Вы можете сохранить шаблон в текстовом файле как встроенный ресурс в .NET DLL. Есть некоторые заполнители для ваших динамических битов. Что сделало бы ваше текущее решение более удобным в обслуживании. Затем вы загружаете поток из DLL и сохраняете текущую реализацию.

Редактировать текстовый файл проще, чем тот большой кусок SQL, который встроен в ваш файл C #.

Вероятно, вы получите удар по производительности, если перенесете это в один процесс, возможно, вам это понравится, но имейте в виду, что у этого процесса также будут некоторые проблемы с обслуживанием. Мы обычно предпочитаем избегать динамического SQL в хранимых процессах. А ветка 7 way IF - это кошмар обслуживания.

2 голосов
/ 10 февраля 2009

Вы можете создать одну хранимую процедуру с именем Summary, а затем передать имя и столбец в качестве дополнительных параметров. Затем вы создаете динамический SQL и выполняете его.

2 голосов
/ 10 февраля 2009

Я бы порекомендовал вам создать одну хранимую процедуру, которую вы вызываете.

Затем используйте динамический SQL для построения соответствующего оператора select, который будет использоваться в одной хранимой процедуре.

Имеет смысл?

1 голос
/ 10 февраля 2009

Преимущество SP заключается в том, что он предварительно скомпилирован и план выполнения уже создан с учетом данных, которые присутствуют на момент создания SP.

Таким образом, динамический SQL может повлиять на производительность, поскольку сервер SQL не может заранее определить, какие индексы использовать (или даже использовать их или нет). Поскольку в настоящее время вы создаете sp после замены, план запроса создается правильно. Это не будет иметь место после переключения на динамический sql.

Вы также можете создать sp с условием if then, чтобы позаботиться о различных сценариях. Однако это требует сопровождения в случае добавления дополнительных параметров позже.

1 голос
/ 10 февраля 2009

Построение оператора динамически, а затем его выполнение (в T-SQL), по моему мнению, является вашим лучшим выбором. Я бы также избежал создания хранимых процедур в коде, если бы все писало. Самое большое преимущество хранения порчей состоит в том, что их планы выполнения кэшируются на сервере. Если вы удаляете и воссоздаете их часто, эти планы удаляются, так как процесс удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...