【063】清除U9表所有弹性域字段数据脚本
侧边栏壁纸
  • 累计撰写 70 篇文章
  • 累计收到 2 条评论

【063】清除U9表所有弹性域字段数据脚本

竹秋廿九
2025-10-13 / 0 评论 / 8 阅读 / 正在检测是否收录...

清除U9表所有弹性域字段数据脚本

有时候还原了另外一个系统的数据补丁到本地或者新库,有一些实体扩展字段的私有段已经有了
想要保留表数据,但重新设计私有段,特写此清空表私有段的脚本,方便清空后删除实体扩展字段的私有段
默认不执行,只生成语句,想要马上执行请更改@ExecuteFlag参数=1
复制整段脚本到SQL工具中执行即可
-- ====================================================================
-- 动态清除表的弹性段(DescFlexField)数据的脚本
-- ====================================================================

-- 1. 定义输入参数
DECLARE @TableName NVARCHAR(128) = N'SM_Ship'; -- 【必填】需要清除扩展段数据的表名
DECLARE @ExecuteFlag BIT = 0;                  -- 【控制】0: 只输出拼接好的SQL语句; 1: 立即执行清除操作

-- 2. 内部变量声明
DECLARE @Prefix NVARCHAR(128);                 -- 存储查询到的扩展段前缀(如 'DescFlexField')
DECLARE @SqlStatement NVARCHAR(MAX);           -- 存储最终生成的 UPDATE SQL 语句
DECLARE @i INT;
DECLARE @Delimiter NVARCHAR(2) = N'';

-- 3. 动态查询表的扩展段前缀
-- 使用递归 CTE 查找当前表及其所有父类的 ID
With CR As
(
    -- 锚定成员:从指定的表名开始查找 Class ID
    Select l.ID as ID
    From UBF_MD_Class as l
    Where L.DefaultTableName = @TableName
    Union All
    -- 递归成员:查找父类的 Class ID
    Select P.MD_ParentClass_ID as ID
    From UBF_MD_Class as P Inner Join CR ON P.ID=CR.ID
    -- 排除无效的父类 ID (通常为 NULL 或 '0000...' GUID)
    Where ISNULL(P.MD_ParentClass_ID, '00000000-0000-0000-0000-000000000000') != '00000000-0000-0000-0000-000000000000'
)
-- 查找与 Class ID 关联且 DataTypeID 匹配的属性名称作为前缀
-- DataTypeID = '8FF5F5AE-FB0C-4E6E-B1C1-6A5FA355938A' 假设是扩展段数据类型的唯一标识
Select TOP 1 @Prefix = l.Name
From UBF_MD_Attribute as l
Inner Join CR on l.MD_Class_ID = CR.ID
Where l.DataTypeID = '8FF5F5AE-FB0C-4E6E-B1C1-6A5FA355938A';

-- 4. 检查是否找到扩展段前缀
IF @Prefix IS NULL
BEGIN
    PRINT N'错误:未在表 ' + QUOTENAME(@TableName) + N' 及其父类中找到匹配的扩展段前缀 (DataTypeID=''8FF5F5AE-FB0C-4E6E-B1C1-6A5FA355938A'')。';
    RETURN;
END
ELSE
BEGIN
    PRINT N'已找到扩展段前缀:' + @Prefix;
    PRINT N'开始生成清除 SQL 语句...';
END

-- 5. 拼接 UPDATE SQL 语句
SET @SqlStatement = N'UPDATE ' + QUOTENAME(@TableName) + N' SET ';
SET @Delimiter = N'';

-- 5.1 拼接私有段 (_PrivateDescSeg1 到 _PrivateDescSeg30)
SET @i = 1;
WHILE @i <= 30
BEGIN
    SET @SqlStatement = @SqlStatement + @Delimiter + @Prefix + N'_PrivateDescSeg' + CAST(@i AS NVARCHAR(2)) + N'=NULL';
    SET @Delimiter = N', ';
    SET @i = @i + 1;
END

-- 5.2 拼接公共段 (_PubDescSeg1 到 _PubDescSeg50)
SET @i = 1;
WHILE @i <= 50
BEGIN
    SET @SqlStatement = @SqlStatement + @Delimiter + @Prefix + N'_PubDescSeg' + CAST(@i AS NVARCHAR(2)) + N'=NULL';
    SET @Delimiter = N', ';
    SET @i = @i + 1;
END

-- 5.3 结束 SQL 语句
SET @SqlStatement = @SqlStatement + N';';

-- 6. 根据 @ExecuteFlag 执行或输出 SQL 语句
IF @ExecuteFlag = 1
BEGIN
    PRINT N'------------------------------------------------------------';
    PRINT N'【警告】@ExecuteFlag = 1,将立即执行以下 SQL 语句!';
    PRINT N'------------------------------------------------------------';

    -- 输出即将执行的语句
    PRINT @SqlStatement;

    -- 执行动态 SQL
    EXEC sp_executesql @SqlStatement;

    -- 检查执行结果
    IF @@ERROR = 0
        PRINT N'SQL 语句执行成功。受影响行数:' + CAST(@@ROWCOUNT AS NVARCHAR(10));
    ELSE
        PRINT N'SQL 语句执行失败,请检查错误信息。';
END
ELSE
BEGIN
    PRINT N'------------------------------------------------------------';
    PRINT N'【只输出模式】@ExecuteFlag = 0,SQL 语句已生成,但未执行:';
    PRINT N'------------------------------------------------------------';
    SELECT @SqlStatement AS Generated_Clear_SQL;
END

(附)删除所有个性化模板

UBF_PersonalizationPerorg 按组织分配的个性化模板
UBF_PersonalizationPerRole 按角色分配的个性化模板
UBF_PersonalizationPerUser 按用户分配的个性化模板
truncate table [dbo].[UBF_PersonalizationPerorg]
truncate table [dbo].[UBF_PersonalizationPerRole]
truncate table [dbo].[UBF_PersonalizationPerUser]
truncate table [dbo].[aspnet_PersonalizationPerUser]
0

评论

博主关闭了当前页面的评论