sql查询选择中的表达式计算器
我有这个疑问sql查询选择中的表达式计算器,sql,sql-server,tsql,sqlclr,Sql,Sql Server,Tsql,Sqlclr,我有这个疑问 Declare @q varchar(255) = 'A+B' Select A, -- 1 B, -- 2 C, Evaluate(@q) MySum -- 3 From tbl_temp 假设@q也是tbl_temp中的一列 有没有什么sql方法可以做这样的事情 我想到了一个接受表达式和列的函数。只是问问有没有比这更好的方法 如有任何帮助或建议,将不胜感激 谢谢基本答案是否定的。没有简单的方法可以做到这一点。通常,如果您有这样的表达式,那么您将使用动态SQL来解析它们。而且
Declare @q varchar(255) = 'A+B'
Select
A, -- 1
B, -- 2
C,
Evaluate(@q) MySum -- 3
From tbl_temp
假设@q也是tbl_temp中的一列
有没有什么sql方法可以做这样的事情
我想到了一个接受表达式和列的函数。只是问问有没有比这更好的方法
如有任何帮助或建议,将不胜感激
谢谢基本答案是否定的。没有简单的方法可以做到这一点。通常,如果您有这样的表达式,那么您将使用动态SQL来解析它们。而且,不能在函数中使用动态SQL 这就给你留下了两个基本的选择。第一种是使用您自己的解析例程,可能是在CLR(用外部语言编写)中。如果您确实需要此功能,那么这是一种可行的方法
第二种方法是使用允许在函数中使用的存储过程之一:
xp\u cmdshell
。注意:由于安全问题和特殊权限,不建议将此存储过程用作一般解决方案。此外,获取从存储过程计算的值需要一些技巧(基本上是将结果回送到预定义的表变量中)。您可以创建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中没有“eval”方法,但是使用eval SQL.NET库可以很容易地做到这一点
-- CREATE expression
DECLARE @sqlnet SQLNET = SQLNET::New('A+B')
-- EVALUATE expression from a table
SELECT @sqlnet.SetValue('A', A).SetValue('B', B).Eval()
FROM tbl_temp
文件:
-- CREATE expression
DECLARE @sqlnet SQLNET = SQLNET::New('A+B')
-- EVALUATE expression from a table
SELECT @sqlnet.SetValue('A', A).SetValue('B', B).Eval()
FROM tbl_temp