2012-11-14 79 views
0

我需要爲每個NEW DocNumber增加一列(Counts)+1。所以如果DocNumber對於三列是相同的,則計數器將是1,2,3等。下面是代碼。我知道它會更新整個表格,而不是基於相同或不同的文檔編號。有人可以幫我理解這裏的邏輯嗎?使用計數器來增加列號

基本上,我要重新啓動計數器,當它擊中一個新TempDocNumber

DECLARE @DocTable Table (DetailID FLOAT, TempDocNumber FLOAT, Counts INT) 
INSERT INTO @DocTable (DetailID, TempDocNumber, Counts) 
SELECT DetailID, DocumentNumber, 0 FROM ChargebackDetailTempTable 


declare @Counter int 
Set @Counter = 0 
Update @Doctable 
SET @Counter = counts = @Counter + 1 

-- start counter over when new tempdocnumber 
+0

在這種情況下,你不應該需要一個更新。但一般來說,請不要使用這種「古怪的更新」模式。它不受支持,沒有記錄,可能會破壞新版本或Service Pack,並且在表單中不能保證處理順序(尤其是因爲您的@table沒有密鑰或聚簇索引)。 –

回答

3

你可以只創建您的插入這樣的:

DECLARE @DocTable Table (DetailID FLOAT, TempDocNumber FLOAT, Counts INT) 
INSERT INTO @DocTable (DetailID, TempDocNumber, Counts) 
SELECT DetailID, 
     DocumentNumber TempDocNumber, 
     ROW_NUMBER() OVER(PARTITION BY DocumentNumber ORDER BY DetailId) Counts 
FROM ChargebackDetailTempTable 

沒有UPDATE需要。

對於SQL Server 2000

假設DetailID是標識列,你可以試試下面的(同樣不UPDATE需要):

DECLARE @DocTable Table (DetailID FLOAT, TempDocNumber FLOAT, Counts INT) 
INSERT INTO @DocTable (DetailID, TempDocNumber, Counts) 
SELECT DetailID, 
     TempDocNumber, 
     Counts = ( SELECT COUNT(T1.DetailID) + 1 
        FROM ChargebackDetailTempTable T1 
        WHERE T1.DetailID < T.DetailID and T1.TempDocNumber = T.TempDocNumber) 
FROM ChargebackDetailTempTable T 
+0

不幸的是,我沒有使用SQL 2008,這使事情變得複雜一點。我無法使用row_number,否則我很久以前就會使用row_number。 – Jeff

+0

@ user1049984您使用的是SQL Server 2000嗎? – Lamak

+0

我相信這是2003年。無論它是什麼版本,它都不支持行更新。 – Jeff