Có phương pháp nào cho do while
vòng lặp thực hiện trong SQL server 2008 không?
Có phương pháp nào cho do while
vòng lặp thực hiện trong SQL server 2008 không?
Câu trả lời:
Tôi không chắc chắn về DO-WHILE TRONG MS SQL Server 2008 nhưng bạn có thể thay đổi logic vòng lặp WHILE của mình, để SỬ DỤNG như vòng lặp DO-WHILE.
Ví dụ được lấy từ đây: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- Regi-loop-with-continue-and-break-keywords/
Ví dụ về WHILE Loop
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
Kết quả:
1 2 3 4 5
Ví dụ về Vòng lặp WHILE với từ khóa BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
Kết quả:
1 2 3
Ví dụ về WHILE Loop với các từ khóa CONTINUE và BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
Kết quả:
1 2 3 4 5
Nhưng cố gắng tránh các vòng lặp ở cấp cơ sở dữ liệu. Tham khảo .
Nếu bạn không cảm thấy khó chịu với GOTO
từ khóa, nó có thể được sử dụng để mô phỏng a DO
/ WHILE
trong T-SQL. Hãy xem xét ví dụ khá vô lý sau được viết bằng mã giả:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Đây là mã T-SQL tương đương sử dụng goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Lưu ý ánh xạ 1-1 giữa GOTO
giải pháp đã kích hoạt và mã gốc DO
/ WHILE
giả. Một cách triển khai tương tự bằng cách sử dụng một WHILE
vòng lặp sẽ giống như sau:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Bây giờ, tất nhiên bạn có thể viết lại ví dụ cụ thể này dưới dạng một WHILE
vòng lặp đơn giản , vì đây không phải là một ứng cử viên tốt cho một cấu trúc DO
/ WHILE
. Sự nhấn mạnh là tính ngắn gọn của ví dụ hơn là khả năng áp dụng, vì các trường hợp hợp pháp yêu cầu a DO
/ WHILE
rất hiếm.
REPEAT / UNTIL, bất kỳ ai (KHÔNG làm việc trong T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... và GOTO
giải pháp dựa trên T-SQL:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Thông qua việc sử dụng sáng tạo GOTO
và đảo ngược logic thông qua NOT
từ khóa, có một mối quan hệ rất chặt chẽ giữa mã giả gốc và GOTO
giải pháp dựa trên. Một giải pháp tương tự bằng cách sử dụng một WHILE
vòng lặp trông giống như:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Có thể lập luận rằng đối với trường hợp của REPEAT
/ UNTIL
, WHILE
giải pháp dựa trên đơn giản hơn, bởi vì điều kiện if không bị đảo ngược. Mặt khác, nó cũng dài dòng hơn.
Nếu không phải vì tất cả sự khinh thường xung quanh việc sử dụng GOTO
, đây thậm chí có thể là các giải pháp thành ngữ cho những trường hợp ít khi các cấu trúc lặp (ác) cụ thể này cần thiết trong mã T-SQL vì mục đích rõ ràng.
Sử dụng những thứ này theo quyết định của riêng bạn, cố gắng không hứng chịu sự phẫn nộ của các nhà phát triển đồng nghiệp của bạn khi họ bắt bạn bằng cách sử dụng nhiều ác ý GOTO
.
Tôi dường như nhớ lại đã đọc bài báo này nhiều hơn một lần, và câu trả lời chỉ gần với những gì tôi cần.
Thông thường khi tôi nghĩ rằng tôi sẽ cần một DO WHILE
trong T-SQL, đó là bởi vì tôi đang lặp lại một con trỏ và phần lớn tôi đang tìm kiếm sự rõ ràng tối ưu (so với tốc độ tối ưu). Trong T-SQL có vẻ phù hợp với a WHILE TRUE
/ IF BREAK
.
Nếu đó là tình huống đưa bạn đến đây, đoạn mã này có thể giúp bạn tiết kiệm một chút thời gian. Nếu không, chào mừng trở lại, tôi. Bây giờ tôi có thể chắc chắn rằng tôi đã ở đây nhiều hơn một lần. :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT 'Do something with ' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
Thật không may, T-SQL dường như không cung cấp một cách rõ ràng hơn để xác định đơn lẻ hoạt động của vòng lặp, hơn vòng lặp vô hạn này.
Bạn cũng có thể sử dụng biến thoát nếu bạn muốn mã của mình dễ đọc hơn một chút:
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
Điều này có thể phù hợp hơn khi bạn có một vòng lặp phức tạp hơn và đang cố gắng theo dõi logic. Như đã nêu, các vòng lặp rất tốn kém, vì vậy hãy thử và sử dụng các phương pháp khác nếu bạn có thể.
Chỉ While Loop được hỗ trợ chính thức bởi máy chủ SQL. Đã có câu trả lời cho vòng lặp DO while. Tôi đang giải đáp chi tiết về các cách đạt được các loại vòng lặp khác nhau trong máy chủ SQL.
Nếu bạn biết, bạn cần phải hoàn thành lặp đầu tiên của vòng lặp dù sao, sau đó bạn có thể thử do..while hoặc REPEAT..UNTIL phiên bản của SQL server.
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';