Ошибка преобразования varchar в int в столбце, приведенном как int

Я создал представление с именем vReceivedEmail, которое включает столбец varchar с именем RowPrimaryKeyValue. В этом столбце обычно хранятся значения идентификатора первичного ключа, такие как 567781, но время от времени появляется описательный текст «Специальное сообщение».

Я настроил представление так, чтобы оно отображало только записи, содержащие значения первичного ключа, а затем CAST столбец как int.

SELECT      CAST(Email.RowPrimaryKeyValue as int)           as DetailID
FROM        MessageStore.dbo.Email Email
WHERE       ISNUMERIC(Email.RowPrimaryKeyValue) = 1

Когда я тестирую представление, я получаю только записи с ожидаемыми значениями первичного ключа, и когда я смотрю на список столбцов для представления в проводнике объектов, столбец сохраняется с типом данных int.

Затем я попытался применить следующее предложение WHERE в отдельном запросе, ссылаясь на мое сохраненное представление:

SELECT      PotAcc.DetailID
FROM        PotentialAccounts PotAcc
WHERE       PotAcc.DetailID NOT IN (
                SELECT      RecEmail.DetailID
                FROM        vReceivedEmail  RecEmail
            )

... но я возвращаю следующую ошибку:

Ошибка преобразования при преобразовании значения varchar "Ad hoc message" в тип данных int.

«Специальное сообщение» - это данные из столбца, который я отфильтровал и преобразовал в int, но я не знаю, как ему удается споткнуться об этом, поскольку представление явно отфильтровывает это и преобразует столбец в int.


person Matt Hall    schedule 19.06.2017    source источник


Ответы (2)


Isnumeric() может быть обманчивым. .. однако я держу пари, что это связано с оптимизацией SQL Server. Хотя ваше представление работает, это не означает, что внешний запрос гарантирует, что возвращается только INT. Вместо представления... используйте CTE и попробуйте. И поскольку вы находитесь в 2012 году, всего этого можно избежать, как SqlZim объяснил выше.

WITH CTE AS(
SELECT      CAST(Email.RowPrimaryKeyValue as int)           as DetailID
FROM        MessageStore.dbo.Email Email
WHERE       ISNUMERIC(Email.RowPrimaryKeyValue) = 1)


SELECT      PotAcc.DetailID
FROM        PotentialAccounts PotAcc
WHERE       PotAcc.DetailID NOT IN (
                SELECT      RecEmail.DetailID
                FROM        CTE RecEmail
            )
person scsimon    schedule 19.06.2017

person    schedule
comment
Ницца. Раньше не использовал try_convert, поэтому сегодня узнал кое-что новое. Большое спасибо. - person Matt Hall; 19.06.2017
comment
Хороший улов на версии - person scsimon; 19.06.2017