Подтвердить что ты не робот

T-SQL Пользовательская функция перегрузки?

Я понимаю, что T-SQL не является объектно-ориентированным. Мне нужно написать набор функций, имитирующих перегрузку метода в С#.

Является ли перегрузка функций поддерживаемой в T-SQL каким-либо образом? Если это взломать, рекомендуется ли это?

4b9b3361

Ответ 1

Нет, нет способа сделать это.

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

Ответ 2

Одна вещь, которую я успешно выполнил, заключается в том, чтобы написать функцию таким образом, чтобы она обрабатывала нулевые значения, а затем вызывала ее с нулями вместо параметров, которые вы хотели бы пропустить.

Пример:

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

Ответ 3

Вы можете передать sql_variant, но он связан со всеми видами опасностей вокруг него; вы не можете использовать сильную типизацию, как вы можете, с языками OO и перегрузкой.

Если вам нужно найти базовый тип внутри вашей функции, вы можете использовать функцию SQL_VARIANT_PROPERTY.

Ответ 4

Вы можете передать массив значений внутри одной строки и проанализировать их используя эту технику Эрландом Соммарскогом.

Создайте функцию с параметром varchar(max) или несколько, если необходимо, затем введите значения параметров в этой строке, например:

param1;param2;parma3;param4

или

param1:type;param2:type;param3:type

или

calltype|param1;param2;param3

и т.д., вы ограничены только своим воображением...

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

Ответ 5

Я постоянно перегружаю функции, но я знаю, что эти проблемы часто сильно зависят от платформы.

В нашей системе DB2 я обычно перегружаюсь следующим образом:

CREATE Функция Schema1.F1 (дата parm) дата возвращения дата возвращения + 1 месяц,

CREATE Function Schema1.F1 (временная метка маржи) дата возвращения дата возврата (временная метка) + 1 месяц,

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

Единственная проблема, о которой я до сих пор нашел в этом вопросе, - вам лучше быть уверенным, что вы хотите эту функцию, потому что стандартная функция "schema" функции "dropdown". "name" терпит неудачу, потому что не может определить, какую функцию следует удалить. Если кто-то знает, как отказаться от перегруженных функций sql, дайте мне знать!