您可以创建 CLR 函数来评估表达式:
[Microsoft.SqlServer.Server.SqlFunction(DataAccess=DataAccessKind.Read)]
public static object Evaluate(SqlString expression, SqlString values)
{
string[] variables = values.Value.Split(',');
Dictionary<string, string> vars = new Dictionary<string, string>();
foreach(string var in variables)
{
string[] varAndValue = var.Split('=');
vars.Add(varAndValue[0], varAndValue[1]);
}
string expr = expression.Value;
foreach(string var in vars.Keys)
{
expr = expr.Replace(var, vars[var]);
}
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
SqlCommand command = new SqlCommand(string.Format("SELECT {0}", expr), connection);
object result = command.ExecuteScalar();
return result;
}
}
然后在sql中使用如下:
declare @t table(A int, B int, Expr varchar(max))
insert into @t(A,B,Expr)
select 5,6, 'A+B' union all
select 1,2, 'A*B'
select dbo.Evaluate(Expr, 'A=' + cast(A as varchar) + ',' + 'B=' + cast(B as varchar))
from @t