我正在寻找另一种从表值函数中获取数据的解决方案。
我正在使用
dbCommand.CommandText = "select * from My_function(param1, param2)";
dbCommand.CommandType = CommandType.Text;
但我需要解决方案而不使用查询,例如
dbCommand.CommandText = "My_function";
dbCommand.CommandType = CommandType.StoredProcedure;
dbCommand.Parameters.AddRange(parameters);
不幸的是,上面会返回错误
System.Data.SqlClient.SqlException:对过程'My_function'的请求失败,因为'My_function'是一个表值函数对象。
答案 0 :(得分:0)
据我所知,您无法从中选择表值函数。
但是,您可以创建一个c#方法,为您生成select语句:
public DataSet ExecuteTableValuedFunction(string functionName, params SqlParameter[] parameters)
{
var sqlWhiteList = "SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES " +
"WHERE ROUTINE_TYPE = 'FUNCTION' " +
"AND DATA_TYPE = 'TABLE' " +
"AND SPECIFIC_NAME = @FunctionName";
var sql = "SELECT * FROM " + functionName ;
if (parameters.Length > 0)
{
sql += "(" + string.Join(",", parameters.Select(p => p.ParameterName)) + ")";
}
using (var con = new SqlConnection(_connectionString))
{
using (var cmdWhiteList = new SqlCommand(sqlWhiteList, con))
{
cmdWhiteList.Parameters.Add("@FunctionName", SqlDbType.NVarChar, 128).Value = functionName;
var exists = cmdWhiteList.ExecuteScalar();
if (exists != null && exists != DBNull.Value)
{
using (var cmd = new SqlCommand(sql, con))
{
cmd.Parameters.AddRange(parameters);
using (var adapter = new SqlDataAdapter(cmd))
{
var ds = new DataSet();
adapter.Fill(ds);
return ds;
}
}
}
}
}
return null;
}
请注意,此方法使用白名单方法来防止SQL注入攻击。