Создать представление из курсора в SQL? - PullRequest
3 голосов
/ 12 марта 2012

У меня есть таблица (CheckNumber) с этими данными:

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

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

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

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

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

1 Ответ

4 голосов
/ 12 марта 2012

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

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

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

"with as ()" называется 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

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

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