SQL Сервер - исключение «Неверное имя столбца» только при выполнении хранимой процедуры через ADO.NET - PullRequest
0 голосов
/ 02 апреля 2020

Как видно из заголовка, я пытаюсь выполнить хранимую процедуру с C#, но всегда получаю ошибку

Неверное имя столбца

Дело в том, что, если я выполняю его непосредственно в SQL Server Management Studio с теми же параметрами, он просто работает нормально, и я получаю ожидаемые результаты.

Исключение говорит о том, что ошибка относится к этим спецификациям c строки моей процедуры:

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'

Я полностью уверен, что эти столбцы существуют во временной таблице. Они используются в других частях процедуры и работают нормально до этого момента.

В чем, по-вашему, проблема?

1 Ответ

0 голосов
/ 02 апреля 2020

Вероятно, #TBL_FINAL_RESULT во время выполнения - это не временная таблица, как вы думаете. Если временная таблица с таким именем создается в пакете верхнего уровня или в хранимой процедуре выше в стеке, она будет видна в хранимой процедуре. И у него могут быть разные столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...