2015-03-14 2 views
0

У меня есть хранимая процедура, внутри которой у меня есть пара команд if else, половина из которых должна выполнять тот же самый большой кусок кода.Как избежать дублирования кода в sql

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

Как ниже, есть еще несколько условий, когда мне нужно выполнить этот большой кусок кода. Какие структуры могут помочь мне избежать повторения этого кода без особых накладных расходов или может быть, если с ним можно обращаться только с помощью if else?

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

Поток пробы выглядит следующим образом: enter image description here

Пример кода выглядит следующим образом: Примечания: Если другое заявление может быть немного перепутались логически, так как это, где я застрял

if exists(select * from dbo.ResultsStored where Hashedkey = HashBytes('MD5', @StringConcat)) 
begin 

if exists(SELECT * FROM ResultsStored RS CROSS APPLY 
(SELECT MAX(ModifiedAt) AS ModifiedAt FROM Patients pt WHERE pt.RowId = RS.RowId) p 
WHERE p.ModifiedAt > rs.ModifiedAt) 
begin 

print 'begin exists' 
if @firstname is not null 
begin 
SELECT @constVal = FunctionWeight FROM dbo.FunctionWeights WHERE FunctionWeights.FunctionId = 1; 
INSERT INTO #Temp2 (RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage) 
    SELECT RowNumber,@firstname,'firstname',PercentMatch,@constVal,PercentMatch * @constVal FROM dbo.MatchFirstName(@firstname) 
END 

if @Middlename is not null 
    BEGIN 
     SELECT @constVal = FunctionWeight FROM dbo.FunctionWeights WHERE FunctionWeights.FunctionId = 2; 
    INSERT INTO #Temp2 (RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage) 
     SELECT RowNumber, @MiddleName,'Middlename',PercentMatch, @constVal,PercentMatch * @constVal FROM dbo.MatchMiddleName(@MiddleName) 
END 


    /* and calling goes on */ --until this is the large piece of code that needs to be repeated 
select * from #Temp2 
print 'updating results table' 
Update dbo.ResultsStored set FinalSearchSeral = @searchNumber, ModifiedAt = getDate(), PercentMatch = t.Perc from (select SUM(Percentage)/@cnt as Perc from #Temp2 GROUP BY RowNumber) t where HashedKey = HASHBYTES('MD5', @StringConcat) 
select * from dbo.ResultsStored where Hashedkey = HashBytes('MD5', @StringConcat) order by SearchSerial desc, PercentMatch desc 
end 

else if exists(select * from dbo.ResultsStored join dbo.Patients on Patients.rowId = ResultsStored.rowId where ResultsStored.Hashedkey = HashBytes('MD5', @StringConcat) and Patients.ModifiedAt <= ResultsStored.ModifiedAt ) 
begin 
print 'select only' 
select * from dbo.ResultsStored where HashedKey = HASHBYTES('MD5', @StringConcat) order by SearchSerial desc, PercentMatch desc 
end 
end 
else if not exists(select * from dbo.ResultsStored where Hashedkey = HashBytes('MD5', @StringConcat)) 
begin 
print 'insert record'; 
select * from #Temp2 
Insert into dbo.ResultsStored(searchSerial,FinalSearchSeral, StringSearched, RowId,PercentMatch, HashedKey) 
select @searchNumber, @searchNumber, dbo.encrypt(@StringConcat), RowNumber, (SUM(Percentage)/@cnt) as Percentage , HASHBYTES('MD5', @StringConcat) 
FROM #Temp2 GROUP BY RowNumber 
select * from dbo.ResultsStored 
end 
+0

Одним из «решений» является использование вложенных хранимых процедур. Но реально реальная проблема заключается в наличии бизнес-логики в SQL. Несмотря на то, что SQL - это строго язык Turing Complete, он не делает для хорошего языка реальную логику. Кроме того, быстрый взгляд на код подсказывает, что вы пытаетесь создать индекс полнотекстового поиска в SQL (aka Relational DataBase Management System), в отличие от реляционной базы данных в РСУБД. Рассмотрите возможность использования полнотекстового поиска для полнотекстового поиска. – Aron

+0

это что-то вроде того, что лучше linux или windows. Там много людей, которые говорят, что бизнес-логика в SQL - это хорошая идея, и многие другие говорят, что это не так. –

+1

@sidux, erm no ... факт заключается в том, что SQL не имеет очень простых функций, необходимых для серьезного повторного использования кода, передачи массива как объектов в функции ... Я честно не встречал никого, кто всерьез предполагал, что Sprocs - это путь вперед в последние 5 лет. – Aron

ответ

0

Если код тот же, то вы можете написать что-то вроде этого

IF (Time > Y OR @ColumnA = @X) BEGIN ... END 

В вашем примере лет вы можете сделать что-то вроде:

IF (@firstname IS NOT NULL) BEGIN SET @name = @firstname; SET @fId = 1; END; 
    IF (@Middlename IS NOT NULL) BEGIN SET @name = @Middlename; SET @fId =2; END; 
    IF (
     IF EXISTS (SELECT 
         * 
        FROM 
         ResultsStored RS 
         CROSS APPLY (
             SELECT 
             MAX(ModifiedAt) AS ModifiedAt 
             FROM 
             Patients pt 
             WHERE 
             pt.RowId = RS.RowId 
            ) p 
        WHERE 
         p.ModifiedAt > RS.ModifiedAt) 

         SELECT 
          @constVal = FunctionWeight 
         FROM 
          dbo.FunctionWeights 
         WHERE 
          FunctionWeights.FunctionId = @fId; 
         INSERT INTO #Temp2 
           (RowNumber , 
            ValFromUser , 
            ColumnName , 
            ValFromFunc , 
            FuncWeight , 
            percentage 
           ) 
           SELECT 
            RowNumber , 
            @firstname , 
            'firstname' , 
            PercentMatch , 
            @constVal , 
            PercentMatch * @constVal 
           FROM 
            dbo.MatchFirstName(@name) 
+0

Не могли бы вы объяснить, как это решить мою проблему? Я чувствую себя немного потерянным. – Simran

Смежные вопросы