Я использую табличную функцию CLR , чтобы ВЫБРАТЬ и вернуть результаты сложного поиска в базе данных, который использует много переменных.
Документация показывает, что вы строите такую функциюпримерно так:
public partial class UserDefinedFunctions
{
private class ResultRow
// This class holds a row which we want to return.
{
public SqlInt32 CustId;
public SqlString Name;
public ResultRow(SqlInt32 custId_, SqlString name_)
{
CustId = custId_;
Name = name_;
}
}
[SqlFunction(
DataAccess = DataAccessKind.Read,
FillRowMethodName = "Test_FillRow",
TableDefinition = "CustId int" +
"Name nvarchar(50)")]
public static IEnumerable Test()
// This function contains the actual logic.
{
ArrayList results = new ArrayList();
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
using (SqlCommand select = new SqlCommand(
"SELECT TOP 100 custid, name FROM Customers",
connection))
{
using (SqlDataReader reader = select.ExecuteReader())
{
while (reader.Read())
{
results.Add(new ResultRow(
reader.GetSqlInt32(0), // CustId
reader.GetSqlString(1) // Name
));
}
}
}
}
return results;
}
public static void Test_FillRow(
object resultsObj,
out SqlInt32 custid,
out SqlString name)
// This function takes a row and tells SQL Server what variables we want to
// return from it and what types it contains.
{
ResultRow selectResults = (ResultRow)resultsObj;
custid = selectResults.CustId;
name = selectResults.Name;
}
}
Проблема в том, что это довольно повторяющееся.Сначала вы определяете таблицу в блоке SqlFunction.Затем, когда вы добавляете или удаляете столбцы в возвращаемых результатах, вы должны убедиться, что вы обновили его и
- определение в ResultRow
- аргументы конструктора вResultRow
- назначение в ResultRow
- типы, извлеченные из считывателя в Test ()
- выходные аргументы в Test_FillRow ()
- назначения в Test_FillRow()
- и сам SQL-запрос, который является единственной частью, с которой вы действительно пытаетесь начать.
Я работаю над такой функцией, которая принимаетболее двадцати аргументов, возвращает еще больше строк и содержит эти восемь возможных мест для ошибок. Восемь .Все ошибки тривиальны и легко исправимы, но их очень легко сделать, потому что в коде так много мест, которые я должен вручную синхронизировать.
Это нарушение DRY, но я нене знаю, как устранить повторение.Есть ли более краткий способ написания табличных функций CLR?