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

本文关键字:Id 不起作用 存储过程 过程中 存储 | 更新日期: 2023-09-27 18:28:00

我正试图获得类似"Cp-00001"的公司id。如果表中存在数据,则id应为"Cp-00001"+1="Cp=0.0002",并在…上执行

到目前为止,我拥有的是:

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

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

一句忠告:不要这样做在负载下使用这种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