2012-03-12 85 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 

“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 

您应该可以很容易地将此​​查询适配到您的实际数据结构和数据集。