我的SQL语言的查询做得并不好。但我可以用游标来实现之。实现之后才发现,无论多么复杂的查询,利用游标也都会更容易理解。虽然使用游标可能会牺牲一定的性能,但在硬件快速发展的今天,牺牲那么一点半点也未为不可。
以下是我使用游标进行查询的一个实例,其中应该使用临时表的地方因为没有创建成功,只好使用事先创建好的表,显得此段代码有些不足,希望能给大家作抛砖引玉之用。
这是一个在SBO中计算到期应收账款的应用,由于时间仓促,代码中没有太多注释,日后我会慢慢补上的。
代码:
1
CREATE PROCEDURE TS_GetPayDay
2
AS
3
BEGIN
4
DECLARE @DocNum NVARCHAR(100) --订单号
5
DECLARE @NumAtCard NVARCHAR(100) --合同号
6
DECLARE @CardName NVARCHAR(100) --客户
7
DECLARE @PayTimes INT --总付款次数
8
DECLARE @PayTime INT --付款次序
9
DECLARE @Prcnt INT --付款百分比
10
DECLARE @DocTotal NUMERIC --订单总额
11![](/Images/OutliningIndicators/None.gif)
12
DECLARE @DocDate DATETIME --单据日期
13
DECLARE @PayDay DATETIME --到期付款日期
14
DECLARE @PayDay1 DATETIME --
15
DECLARE @Months INT --间隔月份
16
DECLARE @Days INT --间隔天数
17
DECLARE @CurRow INT --当前行
18
DECLARE @CurCtg INT --当前付款条款
19![](/Images/OutliningIndicators/None.gif)
20
DELETE FROM [TS_Payment]
21
DELETE FROM [TS_Payment1]
22
DELETE FROM [TS_Payment2]
23![](/Images/OutliningIndicators/None.gif)
24
DECLARE Rows_cursor CURSOR
25
FOR
26
SELECT T0.DocEntry
27
FROM ORDR T0 ORDER BY T0.DocEntry
28
OPEN Rows_cursor;
29
FETCH NEXT FROM Rows_cursor INTO @CurRow;
30
WHILE(@@FETCH_STATUS<>-1)
31
BEGIN
32
IF(@@FETCH_STATUS<>-2)
33
BEGIN
34
SET @DocNum=(SELECT DocNum FROM ORDR WHERE DocEntry=@CurRow);
35
SET @NumAtCard=(SELECT NumAtCard FROM ORDR WHERE DocEntry=@CurRow);
36
SET @DocDate=(SELECT DocDate FROM ORDR WHERE DocEntry=@CurRow);
37
SET @CardName=(SELECT CardName FROM ORDR WHERE DocEntry=@CurRow);
38
SET @DocTotal=(SELECT DocTotal FROM ORDR WHERE DocEntry=@CurRow);
39![](/Images/OutliningIndicators/None.gif)
40
INSERT INTO [TS_Payment1](DocNum,NumAtCard,CardName,DocTotal)
41
VALUES(@DocNum,@NumAtCard,@CardName,@DocTotal)
42
43
SET @PayTimes=(SELECT InstNum FROM OCTG WHERE GroupNum=
44
(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
45
DECLARE Ctg_cursor CURSOR
46
FOR
47
SELECT T1.IntsNo
48
FROM CTG1 T1
49
WHERE T1.CTGCode=(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow)
50
OPEN Ctg_cursor;
51
FETCH NEXT FROM Ctg_cursor INTO @CurCtg;
52
WHILE(@@FETCH_STATUS<>-1)
53
BEGIN
54
IF(@@FETCH_STATUS<>-2)
55
BEGIN
56
--SELECT @CurCtg
57
SET @PayTime=(SELECT IntsNo FROM CTG1 WHERE IntsNo=@CurCtg
58
AND CTGCode
59
=(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
60
SET @Prcnt=(SELECT InstPrcnt FROM CTG1 WHERE IntsNo=@CurCtg
61
AND CTGCode
62
=(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
63
SET @Months=(SELECT InstMonth FROM CTG1 WHERE IntsNo=@CurCtg
64
AND CTGCode
65
=(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
66
SET @Days=(SELECT InstDays FROM CTG1 WHERE IntsNo=@CurCtg
67
AND CTGCode
68
=(SELECT GroupNum FROM ORDR WHERE DocEntry=@CurRow));
69![](/Images/OutliningIndicators/None.gif)
70
SET @PayDay1=DATEADD(MONTH,@Months,@DocDate);
71
SET @PayDay=DATEADD(DAY,@Days,@PayDay1);
72
INSERT INTO [TS_Payment2](DocNum,NumAtCard,CardName,
73
DocTotal,PayTimes,PayTime,Prcnt,PayDay)
74
VALUES(@DocNum,@NumAtCard,@CardName,
75
@DocTotal,@PayTimes,@PayTime,@Prcnt,@PayDay)
76
END
77
FETCH NEXT FROM Ctg_cursor INTO @CurCtg;
78
END
79
CLOSE Ctg_cursor;
80
DEALLOCATE Ctg_cursor;
81
END
82
FETCH NEXT FROM Rows_cursor INTO @CurRow;
83
END
84
CLOSE Rows_cursor;
85
DEALLOCATE Rows_cursor;
86![](/Images/OutliningIndicators/None.gif)
87
DELETE FROM [TS_Payment1] WHERE DocNum IN(SELECT DocNum FROM [TS_Payment2])
88![](/Images/OutliningIndicators/None.gif)
89
INSERT INTO [TS_Payment]
90
SELECT * FROM [TS_Payment1]
91
UNION ALL
92
SELECT * FROM [TS_Payment2]
93
END
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/None.gif)
55
![](/Images/OutliningIndicators/None.gif)
56
![](/Images/OutliningIndicators/None.gif)
57
![](/Images/OutliningIndicators/None.gif)
58
![](/Images/OutliningIndicators/None.gif)
59
![](/Images/OutliningIndicators/None.gif)
60
![](/Images/OutliningIndicators/None.gif)
61
![](/Images/OutliningIndicators/None.gif)
62
![](/Images/OutliningIndicators/None.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/None.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/None.gif)
67
![](/Images/OutliningIndicators/None.gif)
68
![](/Images/OutliningIndicators/None.gif)
69
![](/Images/OutliningIndicators/None.gif)
70
![](/Images/OutliningIndicators/None.gif)
71
![](/Images/OutliningIndicators/None.gif)
72
![](/Images/OutliningIndicators/None.gif)
73
![](/Images/OutliningIndicators/None.gif)
74
![](/Images/OutliningIndicators/None.gif)
75
![](/Images/OutliningIndicators/None.gif)
76
![](/Images/OutliningIndicators/None.gif)
77
![](/Images/OutliningIndicators/None.gif)
78
![](/Images/OutliningIndicators/None.gif)
79
![](/Images/OutliningIndicators/None.gif)
80
![](/Images/OutliningIndicators/None.gif)
81
![](/Images/OutliningIndicators/None.gif)
82
![](/Images/OutliningIndicators/None.gif)
83
![](/Images/OutliningIndicators/None.gif)
84
![](/Images/OutliningIndicators/None.gif)
85
![](/Images/OutliningIndicators/None.gif)
86
![](/Images/OutliningIndicators/None.gif)
87
![](/Images/OutliningIndicators/None.gif)
88
![](/Images/OutliningIndicators/None.gif)
89
![](/Images/OutliningIndicators/None.gif)
90
![](/Images/OutliningIndicators/None.gif)
91
![](/Images/OutliningIndicators/None.gif)
92
![](/Images/OutliningIndicators/None.gif)
93
![](/Images/OutliningIndicators/None.gif)