2012-03-17 88 views
3

我正在看一些代碼,遇到了一些對我而言很陌生的東西;谷歌沒有證明成果豐碩,所以我想知道是否有人可以解釋下面的代碼是做什麼的?它不涉及我的任何表或數據庫,所以我認爲它是通用代碼,我不需要提供我的數據庫佈局?非常感謝。這個SELECT語句做什麼?

的代碼:

SELECT ROW_NUMBER() OVER (ORDER BY Object_ID) AS weeks 
       FROM SYS.OBJECTS 

回答

2

它將選擇1到N的數字,其中N是在sys.objects中的行數。它不保證排序。

也許這個代碼旨在提供所有星期數(omg!),假設sys.objects中至少有52行。

但是,該代碼將返回超過52行,並且結果不保證是有序的。我建議你擺脫這種混亂。

編輯:作爲替代,我會選擇創建下表:CREATE TABLE Weeks (WeekNumber TINYINT NOT NULL PrimaryKey)並適當填充它。這將比從sys.objects中選擇更快,因爲這個定製表將會更小並且正確排序。

+0

非常感謝您的回覆。你能否提出一個代碼片段可以做到這一點,但你可以在哪裏設置行數? – 2012-03-17 15:02:21

+1

我已經添加了我的選擇。作爲獎勵,您可以使用此表來存儲每週數據。 – usr 2012-03-17 15:04:28

+1

謝謝你的迴應! :) – 2012-03-17 15:07:25

0

開發人員使用系統表sysobjects中的記錄,通過使用ROW_NUMBER()窗口函數並將列別名爲「Weeks」來獲取序列號列表。 sys.objects視圖中的行數將根據定義到數據庫的對象而變化,所以爲什麼有人會這樣做超出我的範圍...

如果需要一個簡單的序列號列表,那麼有更多可預測的方法來獲取他們。

+0

這些數字甚至不保證是連續的。當有很多行時,一個平行計劃將會啓動並干擾排序。 – usr 2012-03-17 14:57:47

+0

您可以確定系統對象中有超過53個對象,因此您可以覆蓋全年的所有星期。是的,他們將被連續編號,但可能未被選中。種類取決於select order statement中的「order by」 – 2012-03-17 16:28:59

+0

我應該放過這些,但是...... @usr,你是說ROW_NUMBER()OVER(任何主鍵字段)可能導致非唯一行數字結果?我想不是。 – Tahbaza 2012-03-18 00:33:12