Использование SqlCommand
может показаться неэффективным, но на самом деле это не так, потому что все команды выполняются в контексте соединения. Если вы не делаете это в тесном цикле (в этом случае вам, вероятно, следует подумать о редизайне UDF), издержки будут минимальными; большая часть накладных расходов, связанных с традиционным доступом к базе данных, связана с установлением соединения и прохождением по сети, ни одна из которых здесь не является проблемой.
Если вас беспокоит весь дополнительный код, который вам нужно написать, используйте вспомогательный метод:
public static TResult Execute<TResult>(SqlConnection connection, string cmdText)
{
using (SqlCommand cmd = new SqlCommand(cmdText, connection))
{
return (TResult)cmd.ExecuteScalar();
}
}
Тогда опирайтесь на это, если у вас есть особенно распространенные функции:
public static byte[] EncryptByKey(SqlConnection connection,
string keyName, string clearText)
{
return Execute<byte[]>(connection,
string.Format("SELECT ENCRYPTBYKEY(KEY_GUID('{0}'), '{1}')"));
}
Попробуйте и посмотрите - если вы не делаете это тысячи раз, вы не должны заметить никакой разницы в производительности. (Также обратите внимание, что я не беспокоюсь о внедрении SQL здесь, потому что мы уже в базе данных - нет способа добраться до этого UDF из внешнего мира.)
Насколько мне известно, не будет более "эффективного" способа. Вы должны помнить, что ваша CLR UDF на самом деле не «внутри» соединения с базой данных, она работает в своем собственном домене приложений, который был введен с SqlContext
, поэтому нет такого понятия, как «прямой» доступ к синтаксису SQL - вы должны фактически выполнить эти команды через контекстное соединение, и любое упрощение будет просто синтаксическим сахаром.
Если вы обнаружите, что делаете это с очень высокой частотой, тогда я бы подумал, действительно ли уместно выполнять всю работу, которую вы пытаетесь делать, из ULF CLR. Основное назначение CLR UDF - расширить функциональность, которая уже доступна в SQL Server. Если вы выполняете чрезмерный доступ к данным или выполняете чрезмерное количество команд только для того, чтобы добраться до встроенных функций, это может быть признаком того, что вы инвертировали свои зависимости, и было бы лучше написать обычный UDF, который разветвляется на несколько утилит CLR утилиты. Просто о чем подумать.