2013-08-18 23 views
-1

我試圖獲取「Cp-00001」之類的公司ID。如果在表中存在的數據,則ID應該是 「CP-00001」 + 1 = 「CP = 00002」 和做...存儲過程中的自動增量Id不起作用

這是我到目前爲止有:

CREATE PROCEDURE [dbo].[sp_AutoGenerateCustomerCode] 
AS 
DECLARE @id VARCHAR(10) 
BEGIN 
    SELECT @id = 'Cp-' + CAST(MAX(CAST(SUBSTRING(CompanyCode,4,5) AS INTEGER))+1 AS VARCHAR) FROM [Beauty Saloon Project].[dbo].[tbl_Company]; 
    IF @id IS NULL 
    BEGIN 
     SET @id = 'Cp-00001'; 
    END 

    RETURN @id; 
END 

但是當我在這裏稱呼它

datatable DT = new datatable 
    DT = ExecuteSpDataTable("sp_AutoGenerateCustomerCode"); 

這返回null

如果我沒有數據,那麼它應該返回Cp-00001,但我有一個數據行,其中公司代碼是轎車是它的原因是什麼?

編輯:

public DataTable ExecuteSpDataTable(string SPName) 
    { 
     try 
     { 
      if (ConnectionOpen()) 
      { 
       SqlCommand objSqlCommand = new SqlCommand(SPName, objConnection); 
       objSqlCommand.CommandType = CommandType.StoredProcedure; 
       objSqlCommand.CommandTimeout = 10000; 
       SqlDataAdapter objSqlDataAdapter = new SqlDataAdapter(); 
       DataTable objDataTable = new DataTable(); 
       objSqlDataAdapter.SelectCommand = objSqlCommand; 
       objSqlDataAdapter.Fill(objDataTable); 
       ConnectionClose(); 
       return objDataTable; 
      } 
      return null; 
     } 
     catch (Exception ex) 
     { 
      objErrorLogs.LogError(ex); 
      return null; 
     } 
    } 
+2

爲什麼不只是創建一個自動遞增的數字標識列?你試圖推出自己的產品,爲自己的痛苦而努力。 –

+0

問題顯然是在你的C#代碼,因爲你描述的存儲過程永遠不會返回NULL – jazzytomato

+0

某些時候需要穹頂的東西其他明智我不會做它只是頭痛: –

回答

3

一個建議的話:千萬不要這麼做!使用此SELECT MAX() + 1方法在加載時不安全,只要有多個用戶使用您的應用程序,您的將會有複製 - 遲早。

唯一可行的解​​決方案是使用

  • ID INT IDENTITY(1,1)列讓SQL Server處理你的數值的自動增量
  • 計算的,堅持列到數值轉換爲珍惜你需要

那麼試試這個:

CREATE TABLE dbo.tblCompany 
    (ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, 
    CompanyID AS 'CP-' + RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED, 
    .... your other columns here.... 
) 

現在,每次行插入tblCompany沒有指定值IDCompanyID

INSERT INTO dbo.tblCompany(Col1, Col2, ..., ColN) 
VALUES (Val1, Val2, ....., ValN) 

那麼SQL Server將自動,安全地增加ID價值,CompanyID將包含類似CP-00001值, CP-00002,......等等 - 自動,安全,可靠,無重複。

更新:,如果你想使CompanyID主鍵,你可以使用這個T-SQL語句:

CREATE TABLE dbo.tblCompany 
    (ID INT IDENTITY(1,1) NOT NULL, 
    CompanyID AS 'CP-' + RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED 
     CONSTRAINT PK_tblCompany PRIMARY KEY NONCLUSTERED, 
    .... your other columns here.... 
) 

CREATE CLUSTERED INDEX CIX_Company ON dbo.tblCompany(ID); 

我會離開ID聚集索引,只是移動主鍵約束代替使用CompanyID

+1

你先生已經如此優雅地清除了我長期以來的困惑,類似於提出的問題...謝謝 –

+0

@如何在此查詢中使公司ID PK? –

+0

@SaluSala:更新了我的回覆 –