2016-08-31 1 views
0

У меня есть странная проблема в SQL Server. В основном у нас есть объект типа общего типа с двумя столбцами, Description 1 и Description 2. Мы проверяем, является ли Description2 числом, и если да, проверьте значение/используйте его. Однако при попытке выполнить запрос я получаю следующую ошибку.SQL Server проверяет, является ли числовое значение все еще порождает ошибку

Ошибка преобразования при преобразовании значения nvarchar 'Test Other' в тип данных int.

Теперь, как правило, я бы просто предположить, что она пытается присоединиться на несобственные значения/и т.д., но varchar это говорит в сообщении об ошибке не должно быть действительным с ISNUMERIC.

Вот пример моего запроса:

SELECT * 
FROM base_table 
JOIN org_type o ON o.id = base_table.org_id 
LEFT JOIN generic_object go ON go.id = base_table.org_id AND ISNUMERIC(description2) 
WHERE description2 = @orgId 
    AND base_table.id = @baseId 

Что странно для меня, когда я удалить последнюю строку из запроса, я не получаю сообщение об ошибке.

+0

Как вы определили '@ baseId'? Сообщите нам как тип данных, так и значение. –

+0

Для этого значение переменной, но в моей системе они в настоящее время установлены на 2535 и 2357 соответственно. – Sh4d0wsPlyr

+0

Есть ли у вас какие-либо идеи о том, откуда поступило сообщение об ошибке «Test Other»? –

ответ

2

Используйте встроенное представление для ввода только числовых описаний описания2. Таким образом, он должен сначала разрешить набор данных, содержащий только числовые значения.

SELECT * 
FROM base_table 
JOIN org_type o ON o.id = base_table.org_id 
LEFT JOIN (SELECT * 
      FROM generic_object 
      WHERE isNumeric(description2)) go ON go.id = base_table.org_id 
WHERE description2 = @orgId 
    AND base_table.id = @baseId 
0

Для меня это похоже на проблему description2 = @orgId. Если вы проверяете ISNUMERIC(description2) на JOIN, другие результаты, которые вы получаете, не будут Numeric для этого столбца. Поэтому предложение Where дает вам ошибку. Попробуйте переместить ISNUMERIC(description2) = 1 в предложение Where.

+0

Попытка это - та же проблема. – Sh4d0wsPlyr

2

Я никогда не видел такого рода присоединение ... но я думаю, что это даст вам желаемый результат. Сначала удалите ISNUMERIC из соединения. Я в основном сравниваю переменную с description2, только если это numeric, и если это не так, просто сравните ее с самим собой, что всегда верно.

WHERE ISNULL(@orgId,'') = case when ISNUMERIC(description2) = 1 then description2 else ISNULL(@orgId,'') end 
+0

Это, кажется, работает для меня, были некоторые другие вопросы, которые это показало мне одновременно, но общая идея работала отлично и позволила мне продвинуться. Спасибо – Sh4d0wsPlyr

+0

Не стоит беспокоиться @ Sh4d0wsPlyr – scsimon