View Full Version : Từ bỏ cursor
TrungBravo
12-10-2009, 11:25 AM
Do cursor có nhiều nhược điểm nên cần hạn chế sử dụng cursor trong trương tŕnh. Dưới đây là một giải pháp thay thế. Dùng biến bảng và ṿng lặp để quét.
DECLARE @_Tk NCHAR(8), @_Ten_Tk NVARCHAR(64)
DECLARE @DmTkList TABLE (Tk NCHAR(8), Ten_Tk NVARCHAR(64))
INSERT INTO @DmTkList(Tk, Ten_Tk) SELECT Tk, Ten_Tk FROM B20DmTk ORDER BY Tk
WHILE (SELECT COUNT(*) FROM @DmTkList) > 0
BEGIN
SELECT TOP 1 @_Tk = Tk FROM @DmTkList
SELECT @_Ten_Tk = Ten_Tk FROM @DmTkList WHERE Tk = @_Tk
PRINT @_Tk + ':' + @_Ten_Tk
DELETE FROM @DmTkList WHERE Tk = @_Tk
END
Nguyen Le Quoc Huy
04-07-2010, 05:34 PM
DECLARE @chvnSQL NVARCHAR(MAX);
SET @chvnSQL = '';
SELECT @chvnSQL = @chvnSQL +
'PRINT ' + CHAR(39) + RTRIM(Tk) + ':' + RTRIM(Ten_Tk) + CHAR(39) + ';' + CHAR(13)
FROM B20DmTk
ORDER BY Tk
EXEC sp_ExecuteSQL @chvnSQL;
kotobuki
04-07-2010, 05:37 PM
Trên chỉ là v́ dụ về duyệt bảng, c̣n mục đích chính là dùng while thay cusor làm nhiều công việc khác.
nếu dùng câu lệnh của "Nguyen Le Quoc Huy" th́ chỉ in được thôi.
Nguyen Le Quoc Huy
04-07-2010, 05:43 PM
Hổng phải vậy đâu.
Ḿnh chỉ muốn viết cho giống sếp Trung thôi, chứ trong chuỗi @chvnSQL có thể đưa bất kỳ câu lệnh nào vô mà
kotobuki
04-08-2010, 08:30 AM
Duyệt một bảng số dư tài khoản
Lấy số dư đầu của các tài khoản đưa vào một bảng phát sinh
Nguyen Le Quoc Huy
04-08-2010, 12:16 PM
Bạn có thể nói rơ hơn 1 tư đi. Ḿnh k hiểu lắm mục đích của bạn.
Theo như ḿnh hiểu th́ yêu cầu của bạn đơn giản là JOIN 2 bảng lại. Như vậy liên quan ǵ đến thay cursor bằng ṿng lặp nhỉ.
TrungBravo
04-09-2010, 03:28 PM
DECLARE @chvnSQL NVARCHAR(MAX);
SET @chvnSQL = '';
SELECT @chvnSQL = @chvnSQL +
'PRINT ' + CHAR(39) + RTRIM(Tk) + ':' + RTRIM(Ten_Tk) + CHAR(39) + ';' + CHAR(13)
FROM B20DmTk
ORDER BY Tk
EXEC sp_ExecuteSQL @chvnSQL;
Phương án của bác Huy rất hay, khi nào có cơ hội ḿnh sẽ dùng. Tuy nhiên p/a này phải đưa lệnh vào chuỗi nên có phức tạp riêng.
Bài trước ḿnh chỉ minh họa đơn giản cho cách duyệt bảng thôi. Thông thường khi duyệt th́ có thể làm nhiều việc nữa chứ không nhất thiết phải PRINT cái tài khoản ra.
Càng có nhiều phương án th́ càng phong phú khi lập tŕnh ;)
vBulletin® v3.8.2, Copyright ©2000-2012, Jelsoft Enterprises Ltd.