Скалярные функции можно вызывать из .NET следующим образом:
SqlCommand cmd = new SqlCommand("testFunction", sqlConn); //testFunction is scalar
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("retVal", SqlDbType.Int);
cmd.Parameters["retVal"].Direction = ParameterDirection.ReturnValue;
cmd.ExecuteScalar();
int aFunctionResult = (int)cmd.Parameters["retVal"].Value;
Я также знаю, что функции с табличным значением можно вызывать аналогичным образом, например:
String query = "select * from testFunction(param1,...)"; //testFunction is table-valued
SqlCommand cmd = new SqlCommand(query, sqlConn);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(tbl);
У меня вопрос: можно ли вызывать функции с табличным значением как хранимые процедуры, как это могут делать скалярные функции? (например, реплицируйте мой первый фрагмент кода с вызовом возвращающей табличное значение функцией и получением возвращенной таблицы с помощью параметра ReturnValue).





Нет, потому что вам нужно их выбрать. Однако вы можете создать хранимую оболочку proc, которая может лишить смысла наличие табличной функции.
Я не думаю, что это действительно повлияет на суть функции с табличным значением. Одним из достоинств TVF является то, что у них есть определенные гарантии безопасности, которых нет у хранимых процедур. Другой момент заключается в том, что их можно использовать повторно, тогда как гораздо сложнее повторно использовать хранимую процедуру без простого копирования и вставки.
@ChuckConway Почему убрали C# из названия? Это было правильно, учитывая тег C# ... но этот тег не помогает, чтобы появиться в Google.