(SqlServer)批量清理指定数据库中所有数据

本文介绍了一种批量清理指定数据库中所有表数据的高效方法,通过避免重复操作和减少错误风险,实现快速清空数据库。适用于项目移交给客户前的准备工作。

[推荐](SqlServer)批量清理指定数据库中所有数据

——通过知识共享树立个人品牌。

在实际应用中,当我们准备把一个项目移交至客户手中使用时,我们需要把库中所有表先前的测试数据清空,以给客户一个干净的数据库,如果涉及的表很多,要一一的清空,不仅花费时间,还容易出错以及漏删,在这儿我提供了一个方法,可快捷有效的清空指定数据库所有表的数据。仅供参考,欢迎交流不同意见。

-- Removealldatafromadatabase

SETNOCOUNT ON
-- Tablestoignore
DECLARE @IgnoreTables
TABLE(TableName varchar( 512))
INSERT INTO @IgnoreTables(TableName) VALUES( ' sysdiagrams ')
DECLARE @AllRelationships
TABLE(ForeignKey varchar( 512)
,TableName varchar( 512)
,ColumnName varchar( 512)
,ReferenceTableName varchar( 512)
,ReferenceColumnName varchar( 512)
,DeleteRule varchar( 512))
INSERT INTO @AllRelationships
SELECTf.name ASForeignKey,
OBJECT_NAME(f.parent_object_id) ASTableName,
COL_NAME(fc.parent_object_id,
fc.parent_column_id) ASColumnName,
OBJECT_NAME(f.referenced_object_id) ASReferenceTableName,
COL_NAME(fc.referenced_object_id,
fc.referenced_column_id) ASReferenceColumnName,
delete_referential_action_desc asDeleteRule
FROMsys.foreign_keys ASf
INNER JOINsys.foreign_key_columns ASfc
ONf. OBJECT_ID =fc.constraint_object_id


DECLARE @TableOwner varchar( 512)
DECLARE @TableName varchar( 512)
DECLARE @ForeignKey varchar( 512)
DECLARE @ColumnName varchar( 512)
DECLARE @ReferenceTableName varchar( 512)
DECLARE @ReferenceColumnName varchar( 512)
DECLARE @DeleteRule varchar( 512)


PRINT( ' LoopthroughalltablesandswitchallconstraintstohaveadeleteruleofCASCADE ')
DECLAREDataBaseTables0
CURSOR FOR
SELECTSCHEMA_NAME(t.schema_id) ASschema_name,t.name AStable_name
FROMsys.tables ASt;

OPENDataBaseTables0;

FETCH NEXT FROMDataBaseTables0
INTO @TableOwner, @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN
IF( NOT EXISTS( SELECT TOP 1 1 FROM @IgnoreTables WHERETableName = @TableName))
BEGIN
PRINT ' [ ' + @TableOwner + ' ].[ ' + @TableName + ' ] ';

DECLAREDataBaseTableRelationships CURSOR FOR
SELECTForeignKey,ColumnName,ReferenceTableName,ReferenceColumnName
FROM @AllRelationships
WHERETableName = @TableName

OPENDataBaseTableRelationships;
FETCH NEXT FROMDataBaseTableRelationships INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName;

IF @@FETCH_STATUS <> 0
PRINT ' =====>NoRelationships ';

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' =====>switchingdeleteruleon ' + @ForeignKey + ' toCASCADE ';
BEGIN TRANSACTION
BEGINTRY
EXEC( '

ALTERTABLE[
' + @TableOwner + ' ].[ ' + @TableName + ' ]
DROPCONSTRAINT
' + @ForeignKey + ' ;

ALTERTABLE[
' + @TableOwner + ' ].[ ' + @TableName + ' ]ADDCONSTRAINT
' + @ForeignKey + ' FOREIGNKEY
(
' + @ColumnName + '
)REFERENCES
' + @ReferenceTableName + '
(
' + @ReferenceColumnName + '
)ONDELETECASCADE;
');
COMMIT TRANSACTION
ENDTRY
BEGINCATCH
PRINT ' =====>can '' tswitch ' + @ForeignKey + ' toCASCADE,- ' +
CAST(ERROR_NUMBER() AS VARCHAR) + ' - ' +ERROR_MESSAGE();
ROLLBACK TRANSACTION
ENDCATCH;

FETCH NEXT FROMDataBaseTableRelationships INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName;
END;

CLOSEDataBaseTableRelationships;
DEALLOCATEDataBaseTableRelationships;

END
PRINT '';
PRINT '';

FETCH NEXT FROMDataBaseTables0
INTO @TableOwner, @TableName;
END
CLOSEDataBaseTables0;
DEALLOCATEDataBaseTables0;

PRINT( ' LoopthougheachtableandDELETEAlldatafromthetable ')

DECLAREDataBaseTables1 CURSOR FOR
SELECTSCHEMA_NAME(t.schema_id) ASschema_name,t.name AStable_name
FROMsys.tables ASt;

OPENDataBaseTables1;

FETCH NEXT FROMDataBaseTables1
INTO @TableOwner, @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN
IF( NOT EXISTS( SELECT TOP 1 1 FROM @IgnoreTables WHERETableName = @TableName))
BEGIN
PRINT ' [ ' + @TableOwner + ' ].[ ' + @TableName + ' ] ';
PRINT ' =====>deletingdatafrom[ ' + @TableOwner + ' ].[ ' + @TableName + ' ] ';
BEGINTRY
EXEC( '
DELETEFROM[
' + @TableOwner + ' ].[ ' + @TableName + ' ]
DBCCCHECKIDENT([
' + @TableName + ' ],RESEED,0)
');
ENDTRY
BEGINCATCH
PRINT ' =====>can '' tFROM[ ' + @TableOwner + ' ].[ ' + @TableName + ' ],- ' +
CAST(ERROR_NUMBER() AS VARCHAR) + ' - ' +ERROR_MESSAGE();
ENDCATCH;
END

PRINT '';
PRINT '';

FETCH NEXT FROMDataBaseTables1
INTO @TableOwner, @TableName;
END
CLOSEDataBaseTables1;
DEALLOCATEDataBaseTables1;

PRINT( ' Loopthroughalltablesandswitchallconstraintstohaveadeleteruletheyhadatthebegginingofthetask ')

DECLAREDataBaseTables2 CURSOR FOR
SELECTSCHEMA_NAME(t.schema_id) ASschema_name,t.name AStable_name
FROMsys.tables ASt;
OPENDataBaseTables2;

FETCH NEXT FROMDataBaseTables2
INTO @TableOwner, @TableName;

WHILE @@FETCH_STATUS = 0
BEGIN

IF( NOT EXISTS( SELECT TOP 1 1 FROM @IgnoreTables WHERETableName = @TableName))
BEGIN
PRINT ' [ ' + @TableOwner + ' ].[ ' + @TableName + ' ] ';

DECLAREDataBaseTableRelationships CURSOR FOR
SELECTForeignKey,ColumnName,ReferenceTableName,ReferenceColumnName,DeleteRule
FROM @AllRelationships
WHERETableName = @TableName

OPENDataBaseTableRelationships;
FETCH NEXT FROMDataBaseTableRelationships INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName, @DeleteRule;

IF @@FETCH_STATUS <> 0
PRINT ' =====>NoRelationships ';

WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @switchBackTo varchar( 50) =
CASE
WHEN @DeleteRule = ' NO_ACTION ' THEN ' NOACTION '
WHEN @DeleteRule = ' CASCADE ' THEN ' CASCADE '
WHEN @DeleteRule = ' SET_NULL ' THEN ' SETNULL '
WHEN @DeleteRule = ' SET_DEFAULT ' THEN ' SETDEFAULT '
END

PRINT ' =====>switchingdeleteruleon ' + @ForeignKey + ' to ' + @switchBackTo;

BEGIN TRANSACTION
BEGINTRY
EXEC( '

ALTERTABLE[
' + @TableOwner + ' ].[ ' + @TableName + ' ]
DROPCONSTRAINT
' + @ForeignKey + ' ;

ALTERTABLE[
' + @TableOwner + ' ].[ ' + @TableName + ' ]ADDCONSTRAINT
' + @ForeignKey + ' FOREIGNKEY
(
' + @ColumnName + '
)REFERENCES
' + @ReferenceTableName + '
(
' + @ReferenceColumnName + '
)ONDELETE
' + @switchBackTo + '
');

COMMIT TRANSACTION
ENDTRY
BEGINCATCH
PRINT ' =====>can '' tchange ' + @ForeignKey + ' backto ' + @switchBackTo + ' ,- ' +
CAST(ERROR_NUMBER() AS VARCHAR) + ' - ' +ERROR_MESSAGE();
ROLLBACK TRANSACTION
ENDCATCH;

FETCH NEXT FROMDataBaseTableRelationships
INTO @ForeignKey, @ColumnName, @ReferenceTableName, @ReferenceColumnName, @DeleteRule;
END;

CLOSEDataBaseTableRelationships;
DEALLOCATEDataBaseTableRelationships;

END
PRINT '';
PRINT '';

FETCH NEXT FROMDataBaseTables2
INTO @TableOwner, @TableName;
END
CLOSEDataBaseTables2;

DEALLOCATEDataBaseTables2;

© 2011EricHu

原创作品,转贴请注明作者和出处,留此信息。

### SQL Server 批量添加字段中文注释的方法与脚本 在SQL Server中,可以通过系统表和存储过程相结合的方式实现批量为字段添加中文注释。以下是一个完整的解决方案,包括方法说明和示例脚本。 #### 方法说明 SQL Server 提供了 `sp_addextendedproperty` 存储过程用于添加扩展属性(如注释)。为了实现批量操作,可以结合查询语句获取所有需要添加注释的字段信息,并动态生成执行语句[^1]。通过这种方式,可以高效地完成批量注释任务。 #### 示例脚本 以下是一个基于系统表的脚本,用于批量指定表的所有字段添加中文注释: ```sql -- 创建临时表存储字段信息及对应的注释内容 CREATE TABLE #FieldComments ( TableName NVARCHAR(128), ColumnName NVARCHAR(128), CommentText NVARCHAR(500) ); -- 插入字段及其注释信息到临时表 INSERT INTO #FieldComments (TableName, ColumnName, CommentText) VALUES ('Person', 'ID', '唯一标识符'), ('Person', 'Name', '姓名'), ('Person', 'Sex', '性别'), ('Person', 'Age', '年龄'); -- 动态生成添加注释的SQL语句 DECLARE @Sql NVARCHAR(MAX) = ''; SELECT @Sql += ' EXEC sp_addextendedproperty ''MS_Description'', ''' + CommentText + ''', ''SCHEMA'', ''dbo'', ''TABLE'', ''' + TableName + ''', ''COLUMN'', ''' + ColumnName + ''';' FROM #FieldComments; -- 执行生成的SQL语句 PRINT @Sql; -- 可以先打印查看生成的SQL语句 EXEC sp_executesql @Sql; -- 清理临时表 DROP TABLE #FieldComments; ``` #### 注意事项 1. 上述脚本中的 `#FieldComments` 表需手动维护字段名和对应的注释内容。可以根据实际需求调整。 2. 如果需要更新已有注释,可将 `sp_addextendedproperty` 替换为 `sp_updateextendedproperty`[^1]。 3. 在运行脚本前,请确保目标数据库中不存在重复的扩展属性,否则会报错。可以先删除已存在的扩展属性再重新添加[^2]。 #### 查询现有字段注释 若需要检查或验证字段注释是否成功添加,可以使用以下查询脚本: ```sql SELECT so.name AS 表名称, sc.name AS 字段名, ep.value AS 注释内容 FROM syscolumns sc JOIN systypes st ON sc.xtype = st.xtype JOIN sysobjects so ON sc.id = so.id LEFT JOIN sys.extended_properties ep ON ep.major_id = sc.id AND ep.minor_id = sc.colid AND ep.name = 'MS_Description' WHERE so.type = 'U' ORDER BY so.name, sc.colorder; ``` 此查询脚本能够列出所有用户定义表的字段及其对应的注释内容。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值