SQL Cast Mystery - PullRequest
       14

SQL Cast Mystery

1 голос
/ 25 марта 2009

У меня есть настоящая загадка с T-SQL ниже. На самом деле он работает либо с DATAP.Private=1, либо с cast as int на Right(CRS,1). То есть, если я раскомментирую DATAP.Private=1, я получаю ошибку Conversion failed when converting the varchar value 'M' to data type int, и если я затем удаляю это преобразование, запрос снова работает. С приведенным актом запрос работает только без Private=1.

Я не могу на всю жизнь понять, как Private=1 может добавить что-либо к результирующему набору, что приведет к ошибке, если только Private не является 'M', но Private bit поле!

SELECT 
      cast(Right(CRS,1) as int) AS Company
    , cast(PerNr as int) AS PN
    , Round(Sum(Cost),2) AS Total_Cost
FROM 
    DATAP 
    LEFT JOIN BU_Summary ON DATAP.BU=BU_Summary.BU
WHERE 
    DATAP.Extension Is Not Null 
    --And DATAP.Private=1
    And Left(CRS,2)='SB'
    And DATAP.PerNr Between '1' And '9A'
    and Right(CRS,1) <> 'm'
GROUP BY 
      cast(Right(CRS,1) as int)
    , cast(PerNr as int)
ORDER BY 
    cast(PerNr as int)

Ответы [ 3 ]

2 голосов
/ 25 марта 2009

Я видел нечто подобное в прошлом. Возможно, предложение DATAP.Private = 1 создает план запроса, который выполняет приведение CRS перед применением фильтра Right(CRS,1) <> 'm'.

Конечно, не должен делать это, но у меня были похожие проблемы в написанном мною T-SQL, особенно когда речь идет о представлениях.

Возможно, вам удастся изменить порядок элементов, чтобы заставить запрос работать, или выберите неотправленные значения данных во временной таблице или табличной переменной, а затем выберите и приведите оттуда в отдельном операторе в качестве временного интервала.

Если вы проверите план выполнения, он может пролить свет на то, что и где рассчитывается. Это может дать вам больше идей относительно того, что вы можете изменить.

0 голосов
/ 25 марта 2009

CAST ('9A' AS int) терпит неудачу, когда я проверял это. Похоже, вы делаете ненужные CASTS для группировки и сортировки. Особенно в GROUP BY, это по крайней мере убьет любой шанс для оптимизации.

0 голосов
/ 25 марта 2009

Просто предположение, но может случиться так, что когда Private = 1, PerNr не может быть ничем иным, как числом в ваших данных (как в PerNr, оно может равняться 9A [или что-то еще]), нарушая приведение сгруппировать и упорядочить по пунктам).

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