-4
這是來自測試學習指南。這個查詢的目的是什麼?這個打印函數是while循環的一部分還是隻在while循環之後運行?這個查詢有什麼作用?
這是爲了刪除1,000至20萬美元之間的發票嗎?
請問while循環每個實際循環?循環將打破總數高於200,000 ....如果發票總數低於1000,則循環將中斷....如果總數在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(通過令人興奮的行)類型的邏輯的一個很好的例子。它非常脆弱。除非人爲的價值超過,否則它可能會陷入無限循環。你的教授真的應該在他們試圖教人之前學習數據庫。 –
大聲笑...那你怎麼覺得呢?是的,我同意。更糟糕的是,這是一個在線課程,在這種特殊情況下教你自己幾乎相當於。這是一件苦差事。感謝上帝的堆棧溢出。 –
我感到你的痛苦。很多時候,教授們用強迫性的例子來教授差的方法論。這給他們的學生和他們未來的僱主帶來了痛苦,使他們不再去教給新生的古老思維方式。你的工作基本上等於一個運行總數。根據sql server的版本,有比使用while循環更好的解決方案。 –