繁体   English   中英

SQL Server - 只有通过 ADO.NET 执行存储过程时才会出现“无效的列名”异常

[英]SQL Server - 'Invalid column name' exception only when executing stored procedure through ADO.NET

正如标题所说,我正在尝试使用 C# 执行存储过程,但总是出现错误

列名无效

问题是,如果我使用相同的参数直接在 SQL Server Management Studio 中执行它,它就可以正常运行并得到预期的结果。

异常表示错误在我的程序的这些特定行上:

UPDATE #TBL_FINAL_RESULT
SET INDICATOR = Y.INDICATOR
FROM #TBL_FINAL_RESULT X
INNER JOIN (
            SELECT
            Z.Code,
            CASE 
                WHEN Z.M_MonthlyDeviation < 0 
                    THEN (
                            CASE
                                WHEN Z.M_MonthlyDeviation < Z.HighReference THEN '8'
                                WHEN Z.M_MonthlyDeviation > Z.LowReference THEN '9'
                                ELSE '6'
                            END
                        )
                    ELSE
                        '9'
                    END AS Indicator
            FROM (
                    SELECT
                    A.Code,
                    A.M_MonthlyReal,
                    A.M_MonthlyDeviation,
                    -1 * (A.M_MonthlyReal * 5 /100) as HighReference,
                    -1 * (A.M_MonthlyReal / 100) as LowReference
                    FROM #TBL_FINAL_RESULT A
                    WHERE A.NivelGRD > 1
            ) Z

)Y ON X.CODE = Y.CODE

这是我执行存储过程的 C# 函数:

public DataTable ExecuteStoredProcedure_Query(string storedProcedure, List<SqlParameter> parametros = null)
    {
        DataTable table = new DataTable();

        using (var conn = Connection)
        {
            using (var cmd = new SqlCommand(storedProcedure, Connection))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                if(parametros != null && parametros.Count > 0)
                {
                    foreach (var param in parametros)
                    {
                        cmd.Parameters.Add(param);
                    }
                }

                SqlDataAdapter adapter = new SqlDataAdapter(cmd);

                try
                {
                    conn.Open();
                    adapter.Fill(table);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        return table;
    }

它抛出以下异常:

无效的列名“NivelGRD”
无效的列名“代码”
无效的列名“M_MonthlyReal”
无效的列名“M_MonthlyDeviation”
无效的列名“M_MonthlyReal”
无效的列名“M_MonthlyReal”
无效的列名“CODE”

我完全确定这些列存在于临时表中。 它们用于程序的其他部分,并且它们工作正常,直到那时。

你认为有什么问题?

运行时的#TBL_FINAL_RESULT可能不是您认为的临时表。 如果在顶级批处理中或在堆栈中更高的存储过程中创建了具有该名称的临时表,它将在存储过程中可见。 它可能有不同的列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM