Все эти операции сравнения равенства подчиняются правилам Тип данных SQL Server:
Когда оператор объединяет два выражения разных типов данных, правила для данныхТип приоритета указывает, что тип данных с более низким приоритетом преобразуется в тип данных с более высоким приоритетом.
Поскольку типы символов имеют более низкий приоритет, чем типы int, запрос в основном такой же, как:
SELECT ...
FROM [dok__Dokument]
WHERE cast([dok_NrPelnyOryg] as int) = 2753
...
Это имеет два эффекта:
- делает все индексы столбцов, включенных в предложение WHERE бесполезными
- , это может вызвать ошибки преобразования.
Вы не первый, у кого возникла эта проблема, на самом деле, в нескольких случаях CSS, с которыми я столкнулся, я в итоге написал статью об этом: На логическом операторе SQL Server короткое замыкание .
Правильное решение вашей проблемы состоит в том, что , если значение поля числовое, тогда тип столбца должен быть числовым .поскольку вы говорите, что данные поступают из стороннего приложения 3 rd , которое вы не можете изменить, лучшее решение - отказаться от поставщика этого приложения и выбрать приложение, которое знает, что делает.Если не считать этого, вам нужно искать типы символов в символьных столбцах:
SELECT ...
FROM [dok__Dokument]
WHERE [dok_NrPelnyOryg] = '2753'
...
В языке AD. Управляемого ADO.Net это означает, что вы используете SqlCommand следующим образом:
SqlCommand cmd = new SqlCommand (@" SELECT ...
FROM [dok__Dokument]
WHERE [dok_NrPelnyOryg] = @nrPelnyOryg
... ");
cmd.Parameters.Add("@nrPelnyOryg", SqlDbType.Varchar).Value = "2754";
...
Просто убедитесь, что вы не попадаете в его ловушку для передачи параметра NVARCHAR (Unicode) для сравнения со столбцом VARCHAR, так как те же самые правила приоритета типов данных, приведенные ранее, приведут к тому, что сравнение произойдет для типа NVARCHAR, таким образом рендерингиндексы, опять же, бесполезны.Самый простой способ попасть в эту ловушку - использовать dredded AddWithValue и передать строковое значение.