У меня есть хранимая процедура, внутри которой у меня есть пара команд if else, половина из которых должна выполнять тот же самый большой кусок кода.Как избежать дублирования кода в sql
Этот большой кусок кода состоит из вызова различных встроенных TVF с использованием различных параметров, переданных в хранимую процедуру.
Как ниже, есть еще несколько условий, когда мне нужно выполнить этот большой кусок кода. Какие структуры могут помочь мне избежать повторения этого кода без особых накладных расходов или может быть, если с ним можно обращаться только с помощью if else
?
Весь этот код находится внутри хранимой процедуры, а вызов встроенного TVF использует некоторые параметры и значения, вычисленные в хранимой процедуре, поэтому я сомневаюсь, что создание функции поможет.
Поток пробы выглядит следующим образом:
Пример кода выглядит следующим образом: Примечания: Если другое заявление может быть немного перепутались логически, так как это, где я застрял
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
Одним из «решений» является использование вложенных хранимых процедур. Но реально реальная проблема заключается в наличии бизнес-логики в SQL. Несмотря на то, что SQL - это строго язык Turing Complete, он не делает для хорошего языка реальную логику. Кроме того, быстрый взгляд на код подсказывает, что вы пытаетесь создать индекс полнотекстового поиска в SQL (aka Relational DataBase Management System), в отличие от реляционной базы данных в РСУБД. Рассмотрите возможность использования полнотекстового поиска для полнотекстового поиска. – Aron
это что-то вроде того, что лучше linux или windows. Там много людей, которые говорят, что бизнес-логика в SQL - это хорошая идея, и многие другие говорят, что это не так. –
@sidux, erm no ... факт заключается в том, что SQL не имеет очень простых функций, необходимых для серьезного повторного использования кода, передачи массива как объектов в функции ... Я честно не встречал никого, кто всерьез предполагал, что Sprocs - это путь вперед в последние 5 лет. – Aron