我想让公司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;
}
}
答案 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
中插入一行而未指定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
。