Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询选择中的表达式计算器_Sql_Sql Server_Tsql_Sqlclr - Fatal编程技术网

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