如何在Sybase中创建用于插入的Cursor

时间:2013-11-18 14:05:32

标签: sql insert cursor sybase

我有以下查询将数据插入表中。问题是有很多记录,它填满了数据库中的事务日志。所以,我需要批量插入或使用游标。任何人都知道如何使用游标重新构造以下查询?

SELECT 
    h.issue_id,
    h.account_id,
    h.shares_held,
    h.shares_change,
    a.current_report_date
INTO #tmp_holding    
FROM edgar_holding h
JOIN edgar_account a ON h.account_id = a.account_id

INSERT INTO edgar_holding_hist
SELECT
    h.issue_id,
    h.account_id,
    h.shares_held,
    h.shares_change,
    h.current_report_date
FROM #tmp_holding h
LEFT JOIN edgar_holding_hist hh 
ON hh.account_id = h.account_id
AND hh.issue_id = h.issue_id
AND hh.current_report_date = h.current_report_date
WHERE hh.issue_id IS NULL
OR hh.account_id IS NULL
OR hh.current_report_date IS NULL

DROP TABLE #tmp_holding 

1 个答案:

答案 0 :(得分:3)

有几种不同的方法可以做到这一点。一种是在初始查询中声明游标,另一种是在#temp表上声明游标。

为简单起见,我将使用#temp表:

DECLARE holding_cursor FOR
SELECT
    h.issue_id,
    h.account_id,
    h.shares_held,
    h.shares_change,
    h.current_report_date
FROM #tmp_holding h
LEFT JOIN edgar_holding_hist hh
ON hh.account_id = h.account_id
AND hh.issue_id = h.issue_id
AND hh.current_report_date = h.current_report_date
WHERE hh.issue_id IS NULL
OR hh.account_id IS NULL
OR hh.current_reporting_data IS NULL

DECLARE
    @issue_id [insert datatype here],
    @account_id [insert datatype here],
    @shares_held [insert datatype here],
    @shares_change [insert datatype here],
    @current_report_date [insert datatype here]

OPEN holding_cursor
fetch holding_cursor into @issue_id, @account_id, @shares_held, @shares_change, @current_report_date
WHILE (@@sqlstatus = 0)
BEGIN
    INSERT INTO edgar_holding_hist (issue_id, account_id, shares_held, shares_change, current_report_date)
    VALUES (@issue_id, @account_id, @shares_held, @shares_change, @current_report_date)

FETCH holding_cursor into @issue_id, @account_id, @shares_held, @shares_change, @current_report_date
END

CLOSE holding_cursor
DEALLOCATE holding_cursor

DROP TABLE #tmp_holding

这样的事情应该有用。由于您还担心事务日志,因此您可以使用if语句经常使用@@rowcount发出dump tran,它计算自游标打开以来获取的行数,计数器。