То, как SQL-сервер оптимизирует запрос, приводит к его поломке. Это иллюстрируется двумя примерами ниже:
SELECT distinct ET.ElementName, ET.Shared, CONVERT(float,ED.Value), ED.SheetSetVersionID, ED.SheetDataID
FROM tElementData ED
INNER JOIN tElementTemplate ET
ON ED.ElementTemplateID = ET.ElementTemplateID
AND ET.ElementName like 'RPODCQRated'
Приведенный выше запрос работает нормально, но это не тот запрос, который мне нужно выполнить.
SELECT distinct ET.ElementName, ET.Shared, CONVERT(float,ED.Value), ED.SheetSetVersionID, ED.SheetDataID
FROM tElementData ED
INNER JOIN tElementTemplate ET
ON ED.ElementTemplateID = ET.ElementTemplateID
AND ET.ElementName like 'RPODCQRated'
AND CONVERT(float,ED.Value) = 0.006388
Приведенный выше запрос выдает исключение, в котором говорится, что он не может преобразовать значение nvarchar в число с плавающей точкой. tElementData.Value является полем nvarchar (500), и некоторые записи не имеют числовых значений, но все значения, где tElementTemplate = 'RPODCQRated' могут быть преобразованы в число с плавающей запятой, как показывает верхний запрос. Кажется, что SQL-сервер в своей мудрости применяет CONVERT (float, ED.Value), прежде чем он пытается присоединиться. Мне нужно, чтобы второй запрос работал как-то, я могу переписать его, но есть ограничения на то, что я могу сделать, не переписывая весь слой данных существующего приложения.
Вещи, которые я пробовал, которые не помогают: перемещение последних критериев в предложение where, а не соединение, создание первого запроса в CTE и применение предложения where к CTE, создание скалярной функции, которая вызывает IsNumeric для данные перед попыткой конвертации.
Единственный недостаток, который я смог получить, - это вставить все данные во временную таблицу, а затем применить условие where к временной таблице. К сожалению, для реализации этого в качестве решения потребовалось бы обширное рефакторинг уровня данных приложения, чтобы устранить скрытую ошибку при поиске определенных записей.
Есть идеи?