?? 8.1.4 實現編碼規則調整處理的通用存儲過程.sql
字號:
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')
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -