存储过程中的自动增量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;
}
}
一句忠告:不要这样做在负载下使用这种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
中插入一行而不指定ID
或CompanyID
的值时:
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
。