存储过程如下所示:

/*******************************************
* 获取表某字段的自定义编号
* 调用方法:Exec p_GetCustomCode 'BAS_PriceArt','ArtCode','RSK',4,0,''
* 返回结果:RSK0001
*******************************************/

CREATE PROC [dbo].[p_GetCustomCode]
@TableName VARCHAR(50), --表名称
@ColumnName VARCHAR(20), --列名称
@Where VARCHAR(100), --查询条件,不需要加WHERE关键字,如:Code='100'
@Prefix VARCHAR(20), --前缀
@NoLength INT=4, --数字长度
@IsEqualPrefix INT, --是否匹配为某前缀的数据
@Code VARCHAR(50) OUTPUT --返回编号
AS
BEGIN

DECLARE
@Max Int,
@ZeroStr Varchar(50);

Set @Code='';
Set @Max=0;
Set @ZeroStr='';

--设置数字部分的字符串
IF(@NoLength>20)
Begin
Set @NoLength=20;
End
ELSE IF(@NoLength<1)
BEGIN
Set @NoLength=4;
END

DECLARE @i INT;
SET @i=1;
WHILE @i<=@NoLength
BEGIN
SET @ZeroStr=@ZeroStr+'0';
SET @i=@i+1;
END


--动态Sql查询语句:查询某表某列的最大值(不包含字段前缀)
DECLARE @Sql NVARCHAR(300);
SET @Sql=' Select @Max=Max(Cast(Right('+@ColumnName+','+CAST(@NoLength AS VARCHAR)+')As Int)) From '+@TableName;

IF(LEN(@Where)>0)
BEGIN
SET @Sql=@Sql+' WHERE '+@Where;
END

IF(@IsEqualPrefix=1)
BEGIN
IF(LEN(@Where)>0)
BEGIN
SET @Sql=@Sql+' WHERE '+@Where+' AND Left('+@ColumnName+','+CAST(LEN(@Prefix) AS VARCHAR)+')='''+@Prefix+''' ;';
END
ELSE
BEGIN
SET @Sql=@Sql+' WHERE Left('+@ColumnName+','+CAST(LEN(@Prefix) AS VARCHAR)+')='''+@Prefix+''' ;';
END
END

EXEC sp_executesql @Sql,N'@Max Int Output',@Max OUTPUT;

IF(ISNULL(@Max,0)>0)
BEGIN
SELECT @Code=@Prefix+RIGHT(@ZeroStr+CAST(@Max + 1 AS VARCHAR),@NoLength);
END
ELSE
BEGIN
SELECT @Code = @Prefix +LEFT(@ZeroStr,@NoLength-1)+'1';
END

PRINT @Code;
SELECT @Code;
END