2015-11-27 68 views
-2

對於我確定的道歉是一個非常基本的問題。我剛剛深入到sql的深度和學習,因爲我走了。未聲明存儲過程主鍵

a)在存儲過程(sql server 2012)中,如果我沒有聲明主鍵之一的返回值,它會創建一個嗎?因爲在我這樣做的情況下,我沒有計劃過一把鑰匙,也沒有一個領域可以作爲一個。

b)如果我必須設置密鑰,那麼代碼是什麼?我可以回顧這個問題,如何在每次運行SELECT時都有一個計數器增量(因爲如果我必須設置一個鍵,我可能會使用它)?

ETA 我只是碰到遊標的概念,從中我想你也不需要管理的主要領域爲系統保持確定了其行來了。
@ L.克洛茨,因爲你提供了一種方法來製作一個關鍵:如果系統有自己的鑰匙,你會在什麼情況下使用明確設置的鑰匙? 並且要清楚,我會把它放在下面?

ALTER PROCEDURE [dbo].[partsneed] 
    id INT PRIMARY KEY AUTO_INCREMENT 
    ,@PartIDIN varchar(20)=0 
    ,@COstatusIN char=0 
    ,@QTYneedIN float=0 
    ,@DateNeedIN date='1900/1/1' 
    ,@QTYhrsIN float=0 
+2

分享你寫的代碼。 –

+0

它不創建一個,除非你設置一個。這會將自動增量主鍵列添加到當前沒有主鍵的表中。 tablename應該是你的表的名字。 ALTER TABLE tablename ADD id INT PRIMARY KEY AUTO_INCREMENT; –

回答

0

我不確定爲什麼你需要主鍵,但代碼示例和進一步的解釋會有幫助。您可以嘗試如下所示:

SELECT 
    row_number() OVER (ORDER BY name) id 
     ,[name] 
FROM [mydb].[dbo].[names] 

創建一個新的自動遞增列。

+0

聽起來像我不需要在我習慣的思維中創建一個真正的'鑰匙'。但是我欣賞你的代碼,因爲我有另外一種情況,我想跟蹤SELECT正在讀取的行數,所以我可以使用它來決定是否退出LOOP。雖然這也似乎是我應該做不同的事情... – Hsmith

+0

錯,問題。我是否正在閱讀,說它會隨着名稱的變化而增加?如果有幾行同名的行呢?將它們加起來或將每個不同的名稱計爲1? – Hsmith

+0

不會。它會爲每一行創建一個唯一的ID,「order by」只是定義順序(在這種情況下按字母順序) –