Я понимаю, что T-SQL не является объектно-ориентированным. Мне нужно написать набор функций, имитирующих перегрузку метода в С#.
Является ли перегрузка функций поддерживаемой в T-SQL каким-либо образом? Если это взломать, рекомендуется ли это?
Я понимаю, что T-SQL не является объектно-ориентированным. Мне нужно написать набор функций, имитирующих перегрузку метода в С#.
Является ли перегрузка функций поддерживаемой в T-SQL каким-либо образом? Если это взломать, рекомендуется ли это?
Нет, нет способа сделать это.
Я рекомендую вам пересмотреть требование, так как "сделать яблоки похожими на апельсины" часто бывает трудно сделать и сомнительное значение.
Одна вещь, которую я успешно выполнил, заключается в том, чтобы написать функцию таким образом, чтобы она обрабатывала нулевые значения, а затем вызывала ее с нулями вместо параметров, которые вы хотели бы пропустить.
Пример:
create function ActiveUsers
(
@departmentId int,
@programId int
)
returns int
as
begin
declare @count int
select @count = count(*)
from users
where
departmentId = isnull(@departmentId, departmentId)
and programId = isnull(@programId, programId)
return @count
end
go
Применение:
select ActiveUsers(1,3) -- users in department 1 and program 3
select ActiveUsers(null,3) -- all users in program 3, regardless of department
select ActiveUsers(null,null) -- all users
Вы можете передать sql_variant, но он связан со всеми видами опасностей вокруг него; вы не можете использовать сильную типизацию, как вы можете, с языками OO и перегрузкой.
Если вам нужно найти базовый тип внутри вашей функции, вы можете использовать функцию SQL_VARIANT_PROPERTY
.
Вы можете передать массив значений внутри одной строки и проанализировать их используя эту технику Эрландом Соммарскогом.
Создайте функцию с параметром varchar(max)
или несколько, если необходимо, затем введите значения параметров в этой строке, например:
param1;param2;parma3;param4
или
param1:type;param2:type;param3:type
или
calltype|param1;param2;param3
и т.д., вы ограничены только своим воображением...
Используйте технику из ссылки, чтобы разделить этот массив и использовать программную логику для использования этих значений, как вы пожелаете.
Я постоянно перегружаю функции, но я знаю, что эти проблемы часто сильно зависят от платформы.
В нашей системе DB2 я обычно перегружаюсь следующим образом:
CREATE Функция Schema1.F1 (дата parm) дата возвращения дата возвращения + 1 месяц,
CREATE Function Schema1.F1 (временная метка маржи) дата возвращения дата возврата (временная метка) + 1 месяц,
Это действительно полезно, когда у вас есть несколько запросов, которые имеют схожие требования к формации.
Единственная проблема, о которой я до сих пор нашел в этом вопросе, - вам лучше быть уверенным, что вы хотите эту функцию, потому что стандартная функция "schema" функции "dropdown". "name" терпит неудачу, потому что не может определить, какую функцию следует удалить. Если кто-то знает, как отказаться от перегруженных функций sql, дайте мне знать!