2010-10-31 49 views
-1


我想自動增加字母數字字段(例如productidproduct表中)。使用字母數字自動遞增值

但我收到一個錯誤(見下文)。 有人可以看看這個錯誤或任何其他方法來完成這項任務?

我的表的詳細信息:

create table tblProduct 
(
id varchar(15) 
) 

create procedure spInsertInProduct 
AS 
Begin 
    DECLARE @PId VARCHAR(15) 
    DECLARE @NId INT 
    DECLARE @COUNTER INT 
    SET @PId = 'PRD00' 
    SET @COUNTER = 0 
    --This give u max numeric id from the alphanumeric id 
    SELECT @NId = cast(substring(id, 3, len(id)) as int) FROM tblProduct group by left(id, 2) order by id 
    --here u increse the vlaue to numeric id by 1 
    SET @NId = @NId + 1 
    --GENERATE ACTUAL APHANUMERIC ID HERE 
    SET @PId = @PId + cast(@NId AS VARCHAR) 
    INSERT INTO tblProduct(id)values (@PId) 
END 

我剛開了以下錯誤:

Msg 8120, Level 16, State 1, Procedure spInsertInProduct, Line 10 Column 'tblProduct.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. Msg 8120, Level 16, State 1, Procedure spInsertInProduct, Line 10 Column 'tblProduct.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.**

+0

這是否意味着要求幫助? 「創建表」語句是一個很長的行,因此無法讀取,與錯誤消息相同。此外,沒有提供關於使用的數據庫和數據庫版本的信息。 – vog 2010-10-31 15:10:03

+0

我的第一個問題是無法格式化問題的可讀格式。數據庫版本是SQL Server 2005 – sunit 2010-10-31 15:12:00

+0

我試圖重新格式化問題並將您的數據庫版本添加爲標記。 – 2010-10-31 15:13:11

回答

0

你行

SELECT @NId = cast(substring(id, 3, len(id)) as int) 
    FROM tblProduct 
    group by left(id, 2) 
    order by id 

是不是做你希望它是什麼。它失敗了,因爲你不能直接在選擇中包含id,因爲你正在按左(id,2)分組,而不是id本身。分組時,除非它是分組的一部分,否則不能將某些東西放入select語句中,除非它是分組依據的一部分或集合(例如SUM和MAX)。

(編輯:校正,左和子字符串不是0基於 - 讓珠三角標籤和這樣的,我們需要串4,左3)

這樣做的正確的方法是:

SELECT @NId = cast(substring(MAX(id), 4, len(MAX(id))) as int) 
    FROM tblProduct 
    group by left(id, 3) 
    order by left(id, 3) 
+0

Hi先生Brisbe,你可以用正確的方式在行下面重新格式化,因爲我沒有得到你所說的... – sunit 2010-10-31 15:17:54

+0

SELECT @ NId = cast(substring(id,3,len(id))as int)FROM tblProduct group by left(id,2)order by ID – sunit 2010-10-31 15:18:21

+0

group by語句中的引用不需要位於查詢中的select語句中 – JeffO 2010-10-31 15:19:36

0
SELECT @NId = max(
        cast(substring(id, 4, len(id)) as int) 
       ) 
FROM tblProduct; 

這裏假設你的字符串函數返回的數字部分你的ID。因爲在其他例子中你的編號是以PRD開頭的,所以我做了修改。

備註:沒有理由讓您的產品ID以數據庫中的PRD開頭。如果這是一個標識字段,您可以將其設置爲1遞增,並且在任何顯示中只有'PRD'+ Cast(標識爲varchar25))作爲ProductID。也許這並不是所有ID的簡單都不是以相同的三個字母開頭。

+0

嗨先生傑夫,現在我是獲取此會話錯誤:消息245,級別16,狀態1,過程spInsertInProduct,行12 將varchar值「D00」轉換爲數據類型int時轉換失敗。 – sunit 2010-10-31 15:50:37

+0

請給出一個ID的例子,我們可以幫助你的子字符串。我猜你在某些情況下不應該從3個角色開始。 – JeffO 2010-10-31 17:38:00

0

我已經在SQL Server 2000和查詢分析器中測試過你的存儲過程,它工作得很好。只是我已經從中刪除了創建表代碼。

+0

創建proc後,你運行?因爲它給出空值 – sunit 2010-10-31 15:45:23

+0

我的意思是你得到exptected結果? – sunit 2010-10-31 15:45:51

+0

@Sunit,不,我沒有運行它。但只測試它。 – mahesh 2010-10-31 16:17:14