2010-09-17 15 views
5

Tôi có một SQL Server sp sử dụng một con trỏ như sau:hàng đếm trước khi xử lý với một TSQL con trỏ

DECLARE TestCursor CURSOR FOR 
    SELECT 
     tblHSOutcomes.strOutcomeName, 
     tblHSData.fkHSTest 
    FROM 
     tblHSData 
     INNER JOIN tblHSOutcomes ON tblHSData.fkOutcome = tblHSOutcomes.uidOutcome 
     INNER JOIN tblHSTests ON tblHSData.fkHSTest = tblHSTests.uidTest 
    WHERE 
     tblHSData.fkEpisode = @uidHSEpisodes 

OPEN TestCursor 
    FETCH NEXT FROM TestCursor 
    INTO @Result, @TestID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
...etc 

Đó là làm việc tốt, tuy nhiên nó sẽ được tốt đẹp để có thể kiểm tra xem các truy vấn con trỏ có bất cứ hồ sơ trước khi tiếp tục xử lý thông qua nó. nếu có @@ var mà tôi có thể sử dụng để kiểm tra điều này? Tôi biết có @@ ROWCOUNT - nhưng điều này chỉ có số lượng hiện tại của hàng được xử lý - vì vậy không phải là rất hữu ích

lý tưởng tôi muốn để có thể làm điều gì đó như thế này:

if @@cursorQueryHasRecords 
BEGIN 
WHILE @@FETCH_STATUS = 0 
BEGIN 
...etc 

nhờ

nat

+6

Và tại sao bạn không thể sử dụng @@ FETCH_STATUS bản thân? – Arvo

+0

Và bạn có thực sự cần một con trỏ hay không, chúng thường là lựa chọn tồi tệ nhất. http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM

Trả lời

4
if exists(
    SELECT 
     tblHSOutcomes.strOutcomeName, 
     tblHSData.fkHSTest 
    FROM 
     tblHSData 
     INNER JOIN tblHSOutcomes ON tblHSData.fkOutcome = tblHSOutcomes.uidOutcome 
     INNER JOIN tblHSTests ON tblHSData.fkHSTest = tblHSTests.uidTest 
    WHERE 
     tblHSData.fkEpisode = @uidHSEpisodes 
) 
... 
+0

xin cảm ơn vì đã trả lời. làm thế nào để tôi quấn mà trong con trỏ bit .. không muốn chạy truy vấn đó hai lần .. Có lẽ tôi không thể làm decalre con trỏ kiểm tra cho nếu tồn tại (chọn .... – nat