存储过程中的自动增量ID不起作用

时间:2013-08-18 13:37:58

标签: c# sql-server stored-procedures

我想让公司ID像“Cp-00001”。如果数据存在于表中,那么id应该是“Cp-00001”+ 1 =“Cp = 00002”并且继续...

这是我到目前为止所拥有的:

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;
        }
    }

1 个答案:

答案 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-00001CP-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