2012-03-12 2 views
3

У меня есть таблица (CheckNumber) с этими данными:Создать представление из курсора в SQL?

ID NumberFrom NumberTo StateID 
1 1   10  1 
2 2   3  2 

Этих цифры представляют физические документы и его состояние (1 пригодно для использования и 2 является unusuable) Так что теперь я хочу, чтобы создать документ и хочу знать, какой номер будет иметь документ и какие числа могут быть использованы.

Итак, я создал этот курсор.

Declare @numberUsage as table(accountID int,Number Int) 
Declare @bankID int 
Declare @stateID int 
Declare @beginNumber int 
Declare @endNumber int 
Declare cCursor cursor for Select accountID, stateID, beginNumber,endNumber From Finances.CheckNumber 
Open cCursor 
Fetch cCursor Into @bankID,@stateID,@beginNumber,@endNumber 
While @@FETCH_STATUS = 0 
Begin 
    Declare @actual int 
    Set @actual = @beginNumber 
    If @stateID = 1 
    Begin 
     While @actual <= @endNumber 
     Begin 
      if not exists(Select Number From Finances.CheckNPayment Where accountID = @bankID and Number = @actual) 
      Begin 
       Insert Into @numberUsage values(@bankID,@actual) 
      End 
      Set @actual = @actual + 1 
     End 
    End 
    Else 
    Begin 
     While @actual <= @endNumber 
     Begin 
      Delete From @numberUsage Where accountID = @bankID And Number = @actual 
      Set @actual = @actual + 1 
     End 
    End 
    Fetch cCursor Into @bankID,@stateID,@beginNumber,@endNumber 
End 
Close cCursor 
Deallocate cCursor 
Select * From @numberUsage 

Результат таков:

accountID Number 
1   1 
1   4 
1   5 
1   6 
1   7 
1   8 
1   9 
1   10 

Можно ли преобразовать результат таблицы в представлении?

ответ

4

Это займет несколько шагов, но это возможно. Я постараюсь объяснить каждую часть:

Получить список последовательных номеров:

select row_number() over (order by name) as RN from master..spt_values 

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

;with Nums as (
    select row_number() over (order by name) as RN from master..spt_values) 
select * 
from Nums n 
inner join CheckNumber cn 
    on n.RN between cn.NumberFrom and cn.NumberTo 

"предусматривающий как()" называется Common Table Expression (CTE). Ссылка содержит больше информации о том, как это работает.

Теперь нам просто нужно исключить неиспользуемые элементы. Мы можем использовать ту же идею для создания списка неиспользуемых чисел, а затем использовать ключевое слово EXCEPT.

;with Nums as (
    select row_number() over (order by name) as RN from master..spt_values) 
select n.RN 
from Nums n 
inner join CheckNumber cn 
    on n.RN between cn.NumberFrom and cn.NumberTo 
where cn.StateId = 1 
EXCEPT 
select n.RN 
from Nums n 
inner join CheckNumber cn 
    on n.RN between cn.NumberFrom and cn.NumberTo 
where cn.StateId = 2 

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

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