清除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]
评论