SQL Server 错误无效的列名“NaN”

Posted

技术标签:

【中文标题】SQL Server 错误无效的列名“NaN”【英文标题】:SQL Server Error Invalid column name 'NaN' 【发布时间】:2011-11-13 10:48:13 【问题描述】:

我有点问题。我从我的程序的 SQL Server 数据库中获取一些值,对它们进行一些计算,然后将计算的值写回数据库。但是,一些值给了我"Error Invalid column name 'NaN'." 导致此问题的列确实没有任何独特之处。它们是与正常工作的列相同的浮点型列。

con.Open();

AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = " + Make_Up_Depr + " WHERE Asset_ID = " + a, con);

AddPhase1Calc.ExecuteNonQuery();


con.Close();

我不确定这是否足够的代码,但这是导致我出现问题的第一列。

【问题讨论】:

警告。您的代码容易受到 SQL 注入攻击。 @Daniel:这取决于 Make_Up_Depr 的来源。如果不是来自用户输入,那么可能性就小得多。 是的,但仍然很难说。 Make_Up_Depr 是等式的结果。 【参考方案1】:

您需要在Make_Up_Depr 值周围加上单引号:

AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = '" + Make_Up_Depr +
    "' WHERE Asset_ID = " + a, con);

此外,您永远不应该以这种方式构建 SQL 语句。如果变量来自用户输入,那么您很容易受到 SQL 注入攻击。您应该改用参数。

最后,这段代码需要在using 块中:

using (SqlConnection con = whatever)

    con.Open();

    using (AddPhase1Calc = new SqlCommand("UPDATE Asset SET Make_Up_Depr = '" + 
      Make_Up_Depr + "' WHERE Asset_ID = " + a, con))
    
        AddPhase1Calc.ExecuteNonQuery();
    

【讨论】:

【参考方案2】:

我猜 Make_Up_Depr 是一个双精度数,并且在某些情况下计算是评估零除以零。这导致值为 NaN,并且 SQL 正在尝试将其评估为列名/别名(因为它不是双精度值......)

【讨论】:

我从未见过一种语言除以零会导致 NaN。 对不起,零除以零。 msdn.microsoft.com/en-us/library/system.double.nan.aspx 谢谢先生,我修复了除以零的列,效果很好!【参考方案3】:

您的值之一,Make_Up_Depra 正在评估为 NaN。由于这是一个字符串,SQL Server 认为您正在尝试使用该名称引用列。

【讨论】:

以上是关于SQL Server 错误无效的列名“NaN”的主要内容,如果未能解决你的问题,请参考以下文章

将pandas DataFrame写入sql时出现无效列名错误

sql server 2005代码错误 提示插入错误: 列名或所提供值的数目与表定义不匹配。

[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列名 'user1' 无效

sql server 2008 代理服务提供的凭据无效

关于sql server查询的where不识别列名的问题

Hibernate 本机查询:无效的列名错误 SQL-17006