CREATE PROC p_ChangeCodeRule
@TableName sysname, --调整编码规则的表名
@FieldName sysname, --编码字段名
@Old_CodeRule varchar(50), --以逗号分隔的旧的编码规则,每层编码的长度,比如1,2,3,表示有三层编码,第一层长度为1,第二层长度为2,第三层长度为3
@New_CodeRule varchar(50), --以逗号分隔的旧的编码规则,如果某个层次的编码长度为0,表示删除该层编码
@CharFill char(1)=N'0', --扩充编码时,填充的字符
@Position int=0 --为0,从编码的最前面开始压缩或者填充,为-1或者大于旧编码的长度,从最后一位开始处理,为其他值,从指定的位置后开始处理
AS
--参数检查
IF ISNULL(OBJECTPROPERTY(OBJECT_ID(@TableName),N'IsUserTable'),0)=0
BEGIN
RAISERROR(N'"%s"不存在,或者不是用户表',1,16,@TableName)
RETURN
END
IF NOT EXISTS(SELECT * FROM SYSCOLUMNS WHERE ID=OBJECT_ID(@TableName) AND name=@FieldName)
BEGIN
RAISERROR(N'列名"%s"在用户表"%s"中无效',1,16,@FieldName,@TableName)
RETURN
END
IF ISNULL(@Old_CodeRule,'')=''
OR ISNULL(@New_CodeRule,'')=''
BEGIN
RAISERROR(N'必须编码规则字符串',1,16)
RETURN
END
IF PATINDEX(N'%[^0-9^,]%',@Old_CodeRule)>0
BEGIN
RAISERROR(N'编码规则字符串"%s"中只能包含数字和逗号(,)',1,16,@Old_CodeRule)
RETURN
END
IF PATINDEX(N'%[^0-9^,]%',@New_CodeRule)>0
BEGIN
RAISERROR(N'编码规则字符串"%s"中只能包含数字和逗号(,)',1,16,@New_CodeRule)
RETURN
END
--调用函数f_ChangeCodeRule得到编码处理的sql语句
DECLARE @s nvarchar(4000)
SET @s=dbo.f_ChangeCodeRule(@Old_CodeRule,@New_CodeRule,@CharFill,@Position,@FieldName)
SELECT @TableName=QUOTENAME(@TableName),@FieldName=QUOTENAME(@FieldName)
EXEC(N'BEGIN TRAN
--将处理后的编码与处理前的编码保存到临时表
SELECT Old_No='+@FieldName+N',New_No=('+@s+N')
INTO # FROM '+@TableName+N' WITH(XLOCK,TABLOCK)
--检查更新后的编码是否存在重复
IF EXISTS(SELECT New_No FROM # GROUP BY New_No HAVING COUNT(*)>1)
BEGIN
--如果重复,则显示会产生生理的编码
SELECT * FROM # a
WHERE EXISTS(
SELECT * FROM # WHERE New_No=a.New_No AND Old_No<>a.Old_No)
ORDER BY New_No,Old_No
ROLLBACK TRAN
END
ELSE
BEGIN
--如果编码处理后不重复,则更新到编码表中
UPDATE a SET '+@FieldName+N'=b.New_No
FROM '+@TableName+N' a,# b
WHERE a.'+@FieldName+N'=b.Old_No
COMMIT TRAN
END')
138.实现编码规则调整处理的通用存储过程
最新推荐文章于 2022-03-16 21:44:46 发布