2015-07-10 48 views
0
select top 1 @arastr = k 
from #m 
where datalength(k) = (select max(datalength(k)) from #m) 

這個查詢做了什麼以及select top 1 @arastr = k是什麼?這個查詢是從已經工作了7-8年的存儲過程中獲取的,所以查詢沒有任何問題,但我無法理解它的功能。帶有「select top 1 @arastr = k」的不尋常的SQL Server查詢

#m是在查詢的早期創建的臨時表。)

+0

你不好笑彌敦道。你改變了這個問題,現在人們不明白這個問題的關鍵。因爲像你這樣的人而離開向這個網站提問的人! – ThePhoenix

回答

0

這是一個相當普遍的(但有點老氣)的方式來獲得k的入值(先前聲明!)變量@arastr供以後使用。

函數DATALENGTH將測量例如一個VARCHAR。

隨着TOP 1,你在任何情況下geht結果只有一個排,一個與「最長的」 K,它的價值是在@arastr事後...

編輯:正如@jpw這將指出是隨機的,如果有多於一個k具有相同(最長)的長度。

不知道,什麼#m看起來像'K'什麼樣的數據我不能告訴你。

+0

謝謝Shnugo。那是對的。當我在另一個數據庫實例中使用同一個表運行代碼後,將精確的結果作爲您的提示。 – ThePhoenix

3

查詢中選擇一個隨機值在臨時表#m(因爲top是沒有order by子句使用)從柱k,並將其分配給一個變量@arastr(先前已經推測聲明)。所選字符串將與表中最長的字符串(通過數據長度函數測量))匹配。

+0

不,這個值不會是隨機的,因爲WHERE會選擇「最長」的k – Shnugo

+2

@Shnugo如果有多個值具有最長的屬性會怎麼樣?只是因爲您可以投票並不意味着你應該...查詢是非確定性的。 – jpw

+0

是的,你很重要......如果有幾個條目的長度相同,那麼它將是隨機的。請編輯你的答案,這樣我就可以再次投票! – Shnugo

-1

可能更有意義,如果它看起來像這樣

SET @arastr = (SELECT TOP 1 k 
       FROM #m 
       WHERE DATALENGTH(k) = (SELECT MAX(DATALENGTH(k)) FROM #m))