К сожалению, нет возможности объявить UDF в CLR с желаемой подписью (params SqlString[] p). UDF может иметь только список параметров строгого типа, а ключевое слово «params» в настоящее время не поддерживается (я надеюсь, что это изменится и в будущем).
Вот пример String.Format UDF.
[SqlFunction(DataAccess = DataAccessKind.None)]
public static SqlString clr_StringFormat2(SqlString format, object s1, object s2)
{
return format.IsNull ? SqlString.Null : new SqlString(string.Format(format.Value, SqlTypeToNetType(s1, s2)));
}
Если вы хотите больше параметров, вам нужно будет добавить еще один UDF.
[SqlFunction(DataAccess = DataAccessKind.None)]
public static SqlString clr_StringFormat3(SqlString format, object s1, object s2, object s3)
{
return format.IsNull ? SqlString.Null : new SqlString(string.Format(format.Value, SqlTypeToNetType(s1, s2, s3)));
}
Еще одна вещь, о которой следует помнить в .CLR, это отсутствие перегрузки методов, поэтому ваша UDF должна иметь уникальное имя.
В конце концов, ваш UDF невозможно реализовать в .CLR, если у вас есть/хотите неограниченное количество параметров. Это может быть только фиксированное количество параметров, например. 4 (как в случае, который вы упомянули).
Причина, по которой в таких случаях следует использовать CLR вместо SP, — гораздо лучшая производительность. Но я также хотел бы отметить, что это не означает, что вы получите лучшую производительность с .CLR для всех возможных вещей. В некоторых случаях T-SQL/PS работает намного лучше. Конечно, здесь все зависит от предположения, что в конце концов вы сможете развернуть .CLR в рабочей среде. Если я могу развернуть .CLR в рабочей среде и нуждаюсь в математике, обработке строк или подобных вещах, я всегда использую CLR.
person
Nenad Prekupec
schedule
24.07.2015