133.树形数据编号重排的通用存储过程

博客围绕树形数据编号重排展开,介绍了通用的SQL存储过程。通过该存储过程可对树形数据编号进行重排操作,在信息技术领域的数据库管理和数据处理方面有一定应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--重排编码的存储过程
CREATE PROC p_RTaxisCode
@TableName sysname,    --重排编码的表名
@FieldName sysname,    --编码字段名
@CodeRule varchar(100)  --以逗号分隔的编码规则,每层编码的长度,比如1,2,3,表示有三层编码,第一层长度为1,第二层长度为2,第三层长度为3
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(@CodeRule,'')=''
BEGIN
	RAISERROR(N'必须编码规则字符串',1,16)
	RETURN	
END
IF PATINDEX(N'%[^0-9^,]%',@CodeRule)>0
BEGIN
	RAISERROR(N'编码规则字符串"%s"中只能包含数字和逗号(,)',1,16,@CodeRule)
	RETURN	
END

--生成编码重排处理语句
DECLARE @s nvarchar(4000),@len int,@lens int
SELECT 
	@TableName=QUOTENAME(@TableName),
	@FieldName=QUOTENAME(@FieldName),
	@len=LEFT(@CodeRule,CHARINDEX(N',',@CodeRule+N',')-1),
	@lens=@len,
	@CodeRule=STUFF(@CodeRule,1,CHARINDEX(N',',@CodeRule+N','),N'')+N',',
	@s=N'RIGHT('+CAST(POWER(10,@len) as varchar)
		+N'+(SELECT COUNT(DISTINCT '+@FieldName
		+N') FROM '+@TableName
		+N' WHERE '+@FieldName+N'<=a.'+@FieldName
		+N' AND LEN('+@FieldName+N')='+CAST(@len as varchar)
		+N'),'+CAST(@len as varchar)+N')'

WHILE LEN(@CodeRule)>1
BEGIN
	SELECT 
		@len=LEFT(@CodeRule,CHARINDEX(N',',@CodeRule)-1),
		@s=@s
			+N'+CASE WHEN LEN('+@FieldName
			+N')>'+CAST(@lens as varchar)
			+N' THEN RIGHT('+CAST(POWER(10,@len) as varchar)
			+N'+(SELECT COUNT(DISTINCT '+@FieldName
			+N') FROM '+@TableName
			+N' WHERE '+@FieldName+N'<=a.'+@FieldName
			+N' AND '+@FieldName+N' LIKE LEFT(a.'+@FieldName
			+N','+CAST(@lens as varchar)
			+N')+'''+REPLICATE(N'_',@len)
			+N'''),'+CAST(@len as varchar)
			+N') ELSE '''' END',
		@lens=@lens+@len,
		@CodeRule=STUFF(@CodeRule,1,CHARINDEX(N',',@CodeRule),N'')
END
EXEC(N'UPDATE a SET '+@FieldName+N'='+@s+N' FROM '+@TableName+N' a')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值