2014-12-17 3 views
1

Пытается запустить запрос для определения начала и остановки пробелов и островов в моей таблице. Я применяю запрос, который, как я думаю, будет работать для моего набора данных, но я не могу нормально работать. Я получаю ошибку преобразования, когда я запускаю этот код:Ошибки и острова Ошибка SQL

select start, stop 
from (
select m.API_WellNo + 1 as start, 
    (select min(API_WellNo) - 1 
    from tblWellMaster x 
    where x.API_WellNo > m.API_WellNo) as stop 
from tblWellMaster m left outer join tblWellMaster r on m.API_WellNo = r.API_WellNo - 1 
where r.API_WellNo is null 
) as x 
where stop is not null; 

Здесь ошибка я получаю: Преобразование значения NVARCHAR «31003022850000» переполнена столбец INT.

Я не могу понять, где это ИНТ колонна прибывает из, потому что мой API_WellNo является NVARCHAR (14)

Число является одним из ид, составлявшими последовательность, что я пытаюсь найти пробелы/островов, любая помощь очень ценится, спасибо

+1

Я думаю, что 'min' является преобразование API_WellNo из NVARCHAR к междунар. Указанное число слишком велико для столбца int. – Robbert

+1

'm.API_WellNo + 1' и' min (API_WellNo) - 1' вызвать неявное преобразование в числовой тип – Serpiton

+2

Возможно, сделать конверт 'MIN (CAST (API_WellNo AS BIGINT))' – Mihai

ответ

2

Попробуйте:

with cte as (
    select start = (cast(m.API_WellNo as bigint) + 1) 
     , [stop] = ca.[stop] 
    from tblWellMaster m  
     cross apply (
     select top 1 [stop]=(cast(x.API_WellNo as bigint) -1) 
      from tblWellMaster x 
      where x.API_WellNo > m.API_WellNo 
      order by x.API_WellNo 
     ) as ca 
    where not exists (
     select 1 
     from tblWellMaster r 
     where cast(m.API_WellNo as bigint) = (cast(r.API_WellNo as bigint) - 1)) 
) 
    select start, [stop] 
    from cte 
    where [stop] is not null; 
+1

Спасибо, что это работает по назначению! – Tom

+1

Рад это услышать – SqlZim

 Смежные вопросы

  • Нет связанных вопросов^_^