首页 > 解决方案 > 在计算中使用 SqlParameter

问题描述

我目前正在开发一个 SQL 应用程序,并尝试使用 SqlCommand 和 SqlParameters 构建一个查询。我当前的代码如下所示:

SqlCommand command = database.connection.CreateCommand();

commandTexts = "select id, @current, @comparable, name from items oder by (@current - @comparable) desc"

        SqlParameter currentParam = new SqlParameter("@current", System.Data.SqlDbType.VarChar, 9);
        currentParam.Value = "price" + current;
        SqlParameter comparableParam = new SqlParameter("@comparable", System.Data.SqlDbType.VarChar, 9);
        comparableParam.Value = "price" + comparable;

current可比较的值是在运行时计算的,它们是一种时间戳(每个最长 4 个字符)。我的 SQl 数据库(使用 SQL Server 2017 btw)中的数据类型是 DECIMAL(10,5)。每当我执行查询时,我都会收到一条错误消息,说“类型 varchar 和 varchar 在减法运算符中不兼容”,我只是假设这是因为查询从字面上获取 Parameter 值而不是将其用作列名故意的。例如,这些列被称为“price20_5”,“20_5”是当前的结果,价格被添加到它的前面。

现在我已经考虑了一种可能的解决方法,在中间使用另一个表并循环(因此有多个请求),或者只使用多个子选择,但由于我打算处理大量数据,这似乎真的效率低下并且可能没有必要。

我的问题是,以最干净和最有效的方式启动和运行计算的最佳方法是什么。还没有大量使用 SQL,所以我一直在寻找很酷的新技巧来改进;)

提前致谢!

标签: c#sqlsql-server

解决方案


您不能参数化列名(或对象或模式)。要执行您想要的操作,您需要将名称连接到 SQL 字符串本身,注意不要允许 SQL 注入漏洞。如果列名部分都是从您的代码(不是用户输入)生成的,那通常是一个好的开始。如果这些值不需要额外的检查,那么也许只是:

commandTexts = $"select id, price{current}, price{comparable}, name from items oder by (price{current} - price{comparable}) desc";

推荐阅读