К сожалению, нет возможности объявить 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 over SP в таких случаях, намного выше производительности. Но я также хотел бы отметить, что это не означает, что вы получите лучшую производительность с .CLR для всех возможных вещей. В некоторых случаях T-SQL / PS будет работать намного лучше.
Конечно, все здесь зависит от того, что в конце вы можете развернуть .CLR в производственной среде. Если я могу развернуть .CLR в производстве и мне нужна математика, манипуляции со строками или подобные вещи, я всегда использую CLR.