Cách lặp qua thiết lập kết quả bằng cách sử dụng Transact-SQL trong SQL Server


Tóm tắt


Bài viết này mô tả các phương pháp khác nhau mà bạn có thể sử dụng để mô phỏng một lô-gic tiếp theo của một con trỏ theo quy trình được lưu trữ, kích hoạt hoặc giao Transact-SQL.

Sử dụng Transact-SQL báo cáo để lặp lại thông qua tập kết quả

Có ba phương pháp mà bạn có thể sử dụng để lặp qua một tập kết quả bằng cách sử dụng các câu lệnh Transact-SQL. Một phương pháp là việc sử dụng các bảng temp . Với phương pháp này, bạn tạo "ảnh chụp nhanh" của câu lệnh SELECT ban đầu và dùng nó làm cơ sở cho "cursoring". Ví dụ:
/********** example 1 **********/ declare @au_id char( 11 )set rowcount 0select * into #mytemp from authorsset rowcount 1select @au_id = au_id from #mytempwhile @@rowcount <> 0begin    set rowcount 0    select * from #mytemp where au_id = @au_id    delete #mytemp where au_id = @au_id    set rowcount 1    select @au_id = au_id from #mytemp<BR/>endset rowcount 0
Phương pháp thứ hai là dùng hàm min thành "Walk" một hàng mỗi lần. Phương pháp này sẽ bắt các hàng mới được thêm vào sau khi thủ tục được lưu trữ bắt đầu thực hiện, miễn là hàng mới có một mã định danh duy nhất lớn hơn hàng hiện tại đang được xử lý trong truy vấn. Ví dụ:
/********** example 2 **********/ declare @au_id char( 11 )select @au_id = min( au_id ) from authorswhile @au_id is not nullbegin    select * from authors where au_id = @au_id    select @au_id = min( au_id ) from authors where au_id > @au_idend
Lưu ý: cả hai ví dụ 1 và 2 cho biết một mã định danh duy nhất tồn tại cho mỗi hàng trong bảng nguồn. Trong một số trường hợp, không có mã định danh duy nhất có thể tồn tại. Nếu đó là trường hợp, bạn có thể sửa đổi phương pháp bảng temp để sử dụng cột khóa mới được tạo. Ví dụ:
/********** example 3 **********/ set rowcount 0select NULL mykey, * into #mytemp from authorsset rowcount 1update #mytemp set mykey = 1while @@rowcount > 0begin    set rowcount 0    select * from #mytemp where mykey = 1    delete #mytemp where mykey = 1    set rowcount 1    update #mytemp set mykey = 1endset rowcount 0