これはテストスタディガイドからのものです。このクエリの目的は何ですか?この印刷機能はwhileループの一部ですか、またはwhileループの後にのみ実行されますか?このクエリは何をしますか?
1,000から200,000ドルの請求書を削除するのはこの目的ですか?
whileループはすべて実際にループしますか?ループは破損します。合計は200,000を超えています。請求書の合計が1,000未満の場合、ループは破損します。合計が1,000〜200,000の間であれば、終了しますか?
USE AP
SELECT * INTO #InvoiceCopy FROM Invoices
DECLARE @InvoiceID int, @InvoiceTotal money
DECLARE @Total money
SET @Total = 0
WHILE @Total + (SELECT TOP 1 InvoiceTotal
FROM #InvoiceCopy
ORDER BY InvoiceTotal DESC) <= 200000
BEGIN
SELECT TOP 1 @InvoiceID = InvoiceID, @InvoiceTotal = InvoiceTotal
FROM #InvoiceCopy
ORDER BY InvoiceTotal DESC
IF @InvoiceTotal < 1000
BREAK
ELSE
BEGIN
SET @Total = @Total + @InvoiceTotal
DELETE FROM #InvoiceCopy
WHERE InvoiceID = @InvoiceID
END
END
PRINT 'Total: $' + CONVERT(varchar, @Total, 1)
良い悲しみは何のための学習ガイドですか?これは、この恐ろしいRBAR(行を苦労させる行)タイプのロジックの代わりに、セットベースのロジックを使用する理由の優れた例です。そして、それは非常に脆いです。これは、考案された値を超えない限り、無限ループに終わる可能性があります。あなたの教授は実際に人々を教える前にデータベースを学ぶべきです。 –
LOL ...どうして本当に感じますか?うん、私は同意する。さらに悪いことに、この特別なケースでは自分のことを教えることに相当するオンラインクラスです。それは雑用です。スタックオーバーフローのために神に感謝します。 –
私はあなたの痛みを感じます。余りにも多くの場合、教授はあまりにも多くの場合、彼らは学生や将来の雇用主にとって、新入生に教えられた古風な考え方を解き放つように苦痛を与えます。あなたが取り組んでいるものは、本質的には実行中の合計に相当します。 SQL Serverのバージョンによっては、whileループを使用するよりも優れた解決策があります。 –