2010-06-30 37 views
0

請幫我用這個:SQL存儲過程 - 請幫我寫下這個!

在我的一個腳本中,我將一些數據插入到某個表「Item」中。 「項目」表中的一列是「ItemNumber」。

我想能夠調用一些函數(最可能是一個存儲過程),它會返回給我一個數字號碼,我可以使用ItemNumber。

我不能使用自動增加,因爲ItemNumber是獨一無二的,當在不同的充劇本,我將在「項目」的數據可能存在衝突,已經有「ItemNumber」

我只知道馬克斯編號爲「ItemNumber」,我可以隨意使用任何東西。

我需要一個這個storedProc的表來存儲下一個要使用的數字,對吧?

我想與MAXNUMBER它和storedproc哪裏會回到我的MAXNUMBER ,也增加了MAXNUMBER 1下次使用

我需要幫助寫創建一個列表存儲過程和它的使用調用INSERT INTO Item

編輯:

基本上我抓住從5箇舊表且ItemNumber是NULL或設置數據。對於設置的那些,它們都是唯一的數字。 對於ItemNumber爲NULL的數據我想分配它,什麼是最好的方法?

請幫忙!

感謝,

巫毒

+0

如果您希望得到一些好的答案,請嘗試使其更具可讀性。按照你的思路很難 – 2010-06-30 15:59:21

+1

從不同腳本插入一行不會導致與自動遞增ID衝突。這些ID是在服務器上生成的,而不是由您的腳本生成的。你使用多個數據庫還是表格? – 2010-06-30 16:06:14

+0

@Tom H:是的,我使用多個表並將它們插入到一個表中,其中一些rowdata具有ItemNumber,另一些則爲null。新的數據表要求它們在ItemNumber上不爲空和唯一。 – VoodooChild 2010-06-30 16:11:51

回答

2

(假設SQL服務器 - 可能適用於大多數SQL實現)

如果你在你的領域使用標識約束,該服務器將不允許有被重複的實例。作爲註釋之一,在這種情況下,值是在服務器上計算的,並且您的應用程序沒有(並且在正常情況下不能)提供它。

請注意,服務器不能保證數字是連續的 - 如果您執行插入操作並放棄事務,則使用的值將會「丟失」 - 服務器將不再提供該值。

如果您需要連續的ID號碼,您需要有serlialised訪問權限來更新表格,您需要管理這些表格,哪些表格效率不高。 (您仍可以宣稱它是一個IDENTITY列,但需要設置IDENTITY_INSERT在該表中的每個更新。)

附加:

可能有點雜牌的,但對於一個可能的工作-off場景。 您是否考慮過將數據複製到設置了ID的新表中,然後應用IDENTITY約束,並使用NULL ID(允許服務器爲您分配它們)插入數據? 這可能會解決您的特定問題。

+0

謝謝,還有一個問題:讓我們說使用IDENTITY服務器給我33用於ItemNumber,當我嘗試插入(使用Identity_Insert,如你所建議的),它有33作爲ItemNumber會發生什麼?那會導致碰撞並且不起作用。我需要保持ItemNumbers與之前相同,只分配那些爲空的。 – VoodooChild 2010-06-30 16:19:27

+1

如果您使用的是標識字段,您通常不希望自己指定值 - 問題在於您讓服務器執行此操作(以一致的線程安全方式)。 IDENTITY_INSERT用於當您希望取消服務器有一些很好的理由,而且不應該是一個正常的操作。 (我們將它用於特定的表格,其中的值由於技術原因必須與另一個識別字段相匹配,並且偶爾會進行手動數據修復 - 非常特殊的情況。) – Ragster 2010-06-30 16:26:57

+0

(續)但是 - 如果您有現有數據表中,您可以將約束與NOCHECK一起應用,並且它僅將規則應用於新的插入。您可以手動更改現有的號碼(在該字段的規則內)。服務器永遠不會插入已存在的用於身份字段的號碼。它不會'給''你要插入的號碼 - 你要求插入記錄,它會這樣做,爲你生成號碼。然後你可以問它最後插入的標識是什麼。 – Ragster 2010-06-30 16:27:34