两年多没有碰SQL Server 2000了,昨天整理电脑的时候发现了以前写的一些文档,今天就整理到博客上来吧。不然也对不起“彭建军的专栏”几个字了,呵呵。
很多时候,你想将数据库恢复到最初的“纯净”状态,用数据库DDL脚本当然是最好的选择,但是,如果你没有这个脚本呢?本存储过程就是提供这样一个方法……
/**
* 关于: MS SQL Server 2000 存储过程 - 2
* 作者:彭建军
* 存储过程名称: TruncateAllTables
* 存储过程功能: 清空数据库中除 ESCAPE 表中的记录除外的所有表中的数据!
* 测试环境:SQL Server 2000 SP4 + Windows XP Sp2
* 更新时间:2006-7-8 16:36
**/
USE Pjj
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'P' AND NAME = 'TruncateAllTables')
DROP PROCEDURE TruncateAllTables
GO
--该存储过程功能:
CREATE PROCEDURE TruncateAllTables
WITH ENCRYPTION
AS
BEGIN TRANSACTION
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = 'EscapeTable')
DROP TABLE EscapeTable
CREATE TABLE EscapeTable
(
Name VARCHAR(100)
)
--这里非常重要,请将不想被清空数据的表名插入 EscapeTable 表中
INSERT INTO EscapeTable
SELECT '不想被清空数据的表名'UNION ALL
SELECT 'T2'
DECLARE @SQLString NVARCHAR(500)
DECLARE @TableName VARCHAR(100)
DECLARE MyCursor CURSOR
FOR SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME NOT IN(SELECT NAME FROM EscapeTable)
ORDER BY ID
OPEN MyCurSor
FETCH NEXT FROM MyCurSor INTO @TableName
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SQLString = 'TRUNCATE TABLE ' + @TableName
EXECUTE sp_executesql @SQLString
FETCH NEXT FROM MyCurSor INTO @TableName
END
CLOSE MyCursor
DEALLOCATE MyCursor
DROP TABLE EscapeTable
PRINT 'Procedure is successful done.'
SELECT 1
COMMIT TRANSACTION
GO
--重要!执行该存储过程将清空不包含在 ESCAPE 表中的记录内的所有表中的数据!执行前请确认!
INSERT INTO T1
SELECT 'abc' UNION ALL
SELECT 'opq'
INSERT INTO T2
SELECT 'abc' UNION ALL
SELECT 'opq'
EXECUTE TruncateAllTables
GO
SELECT * FROM T1
SELECT * FROM T2
GO