如何从表值函数中获取数据?

时间:2018-03-15 09:36:31

标签: c# sql-server ado.net

我正在寻找另一种从表值函数中获取数据的解决方案。

我正在使用

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'是一个表值函数对象。

1 个答案:

答案 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注入攻击。

相关问题