`

(转)删除所有表的所有记录(MSSQL)

阅读更多

 

转自:http://nicedayyep.iteye.com/blog/674977

 

 

 

昨天对一测试库要删除所有记录后生成一个备份,本来想自己写个存储过程,想法是从sysobjects表中查出所有用户表,挨个truncate table,实现时发现这样做只能用游标,在网上查了下,MSSQL本身就有这样的游标查询,叫“sp_MSForEachTable ”

CREATE PROCEDURE sp_DeleteAllData
AS
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
GO

上面这个就搞定了。

稍微分析下sp_MSForEachTable 这个存储过程,

create proc sp_MSforeachtable
@command1 nvarchar(2000), @replacechar nchar(1) = N'?', @command2 nvarchar(2000) = null,
   @command3 nvarchar(2000) = null, @whereand nvarchar(2000) = null,
@precommand nvarchar(2000) = null, @postcommand nvarchar(2000) = null
as
/* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its own result set */
/* @precommand and @postcommand may be used to force a single result set via a temp table. */

/* Preprocessor won't replace within quotes so have to use str(). */
declare @mscat nvarchar(12)
select @mscat = ltrim(str(convert(int, 0x0002)))

if (@precommand is not null)
   exec(@precommand)

/* Create the select */
   exec(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' + REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '
         + N' where OBJECTPROPERTY(o.id, N''IsUserTable'') = 1 ' + N' and o.category & ' + @mscat + N' = 0 '
         + @whereand)
declare @retval int
select @retval = @@error
if (@retval = 0)
   exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3

if (@retval = 0 and @postcommand is not null)
   exec(@postcommand)

return @retval

GO

重点在于定义了一个cursor为hcForEach,然后把set给sp_MSforeach_worker 就行了,而这个存储过程查询条件也很有意思,本来我认为应该以xtype以条件,看过后才知道人家用了OBJECTPROPERTY函数,意义上没变化,不过程序读起来感到优雅和简单,这就是差距啊。

还有一点要说明的它的另一个条件category & 0x0002 =0,看了下联机帮助说是

 

category int 用于发布、约束和标识。

在网上google下也没找到有用的信息,不过自己看了下,这个是用二进制做标志位的,第二位如果是1的话就是系统的东西,比如说在2000中存关系图的dtproperties表就是系统表,但是用OBJECTPROPERTY(o.id, 'IsUserTable') = 1且能把这个表查出来,所以加上category这个条件才能更严谨些。2005这个表就没有了,变成了真正的系统表了。

分享到:
评论

相关推荐

    删除MSSQL数据库中的表和清除记录小工具有源代码

    标题中的“删除MSSQL数据库中的表和清除记录小工具有源代码”表明这是一个用于管理Microsoft SQL Server数据库的工具,其主要功能是帮助用户方便地删除数据库中的表以及清除表内的记录。这样的工具在数据库开发和...

    MSsql数据表生成sql脚本

    SQL脚本是一系列预先编写好的SQL命令,可以一次性执行多个操作,如创建、修改或删除数据库对象,如数据表、索引、视图等。在SQL Server环境下,生成SQL脚本通常用于备份数据库结构,迁移数据到其他环境,或者进行...

    在MSSQL中利用猜解出的表和字段得出记录

    2. 触发器和存储过程:使用它们来监控和控制对数据的访问,比如在插入、更新或删除记录时执行特定操作。 3. 角色和权限管理:精细划分角色,分配合适的权限,避免全局管理员的存在。 4. 安全审计:记录所有的数据库...

    易语言mssql数据库操作实例

    "删除"操作使用"DELETE FROM" SQL语句,用于从表中移除特定的记录。这可能需要"WHERE"子句来限制删除的范围。执行删除操作同样依赖于数据库对象的"执行SQL"方法。 "保存"操作在易语言中可能指的是提交当前事务。在...

    用戶管理表設計(MSSQL)

    本文将深入探讨用户管理表的设计,特别是使用Microsoft SQL Server(MSSQL)作为数据库平台。用户管理涉及到权限控制和存储过程,这些都是确保系统安全性和效率的关键要素。 首先,让我们关注用户管理表的设计。一...

    mssql基础代码(一本mssql2005实例书上的所有代码)

    可能还包括添加、修改和删除这些实体的记录,以及查询学生的课程、教师的授课情况或特定课程的平均分等。 此外,可能还会涉及到视图(VIEW)、存储过程(STORED PROCEDURE)和触发器(TRIGGER)的编写,这些都是...

    MSSQL误删除数据查看工具

    1. **日志分析**:工具会读取SQL Server的事务日志,这些日志记录了所有的数据库操作,包括删除操作。通过解析日志,工具可以重建删除操作前后的数据状态。 2. **数据恢复**:找到被删除的数据记录后,工具会尝试把...

    mssql2生成工具

    MSSQL2生成工具的核心功能就是简化这个过程,它能分析数据库中的表结构和记录,自动生成相应的INSERT、UPDATE或DELETE等SQL语句,帮助用户快速实现数据的增、删、改、查。 对于Oracle数据库,该工具可能支持PL/SQL...

    自动备份MSSQL数据库中所有的数据库

    本文将详细探讨如何实现“自动备份MSSQL数据库中所有的数据库”,以及这个过程中涉及的关键技术和注意事项。 MSSQL(Microsoft SQL Server)是一款由微软开发的关系型数据库管理系统,广泛应用于各种规模的企业中。...

    MSSQL精妙实用的SQL语句

    - **删除表**:`DROP TABLE tabname`,用于删除表及其所有数据。 - **增加列**:`ALTER TABLE tabname ADD COLUMN col type`,向表中添加新列。 - **删除列**:在MSSQL中,列一旦添加就不能直接删除。 - **创建...

    经典MSSQL语句大全

    左外连接返回左表的所有记录及右表中匹配的记录,如果右表中没有匹配,则结果为NULL。 ```sql SELECT a.*, b.* FROM table_a LEFT OUTER JOIN table_b ON a.key = b.key; ``` **2. 右外连接(RIGHT OUTER JOIN)**...

    JSP+mssql2008/mssql2000新闻发布管理系统

    `news_log.ldf`是日志文件,记录所有对数据库的事务操作,以确保数据的一致性和完整性。为了部署系统,需要将这些文件与数据库服务器连接,并可能使用`SQL2000创建news.sql`脚本来创建新闻数据表结构。 `SQL2000...

    经典MSSQL语句与常用命令

    这条语句返回`a`表中的所有记录和`b`表中与之匹配的记录。 #### RIGHT OUTER JOIN ```sql SELECT * FROM a RIGHT OUTER JOIN b ON a.a = b.c; ``` 这条语句返回`b`表中的所有记录和`a`表中与之匹配的记录。 #### ...

    MSSQL语法巧用汇总

    左外连接(左连接)的结果集包括连接表的匹配行,同时也包括左表的所有行。即使右表中没有匹配的记录,左表的记录也会出现在结果集中,未匹配的部分会填充NULL值。 以上是对MSSQL常用语句及其特殊用法的一个汇总,...

    Mssql数据库系统安全加固规范.doc

    例如,ELK-Mssql-02-01-01规定了日志的记录和存储方式,以便追踪数据库的操作记录和异常事件。 通信协议是Mssql数据库系统安全的重要组成部分。该规范规定了通信协议的要求,包括加密、身份验证和访问控制等。例如...

    MSSQL2005中删除重复项

    本文将基于提供的信息“MSSQL2005中删除重复项”,深入探讨如何有效地识别并删除表中的重复记录。 ### 标题解读:MSSQL2005中删除重复项 #### MSSQL2005简介 Microsoft SQL Server 2005是微软公司推出的一款企业级...

    MSSQL日志解析和浏览工具

    一款真正意义上的MSSQL日志分析和浏览工具,直接解析LDF文件,支持SQL2008,SQL2005,SQL2000. 程序主要功能: 1:\l日志浏览. 用户可以输入指定的日志块序号,程序从指定的日志块往下浏览,可以快速定位需要查看的日志...

    mssql语句汇总学习加实例

    - `FULL JOIN`(或`FULL OUTER JOIN`):返回两个表中的所有记录,如果某条记录在其中一个表中没有匹配,则对应位置填充NULL。 6. **子查询**: - 子查询可以在`SELECT`, `FROM`, `WHERE`等子句中嵌套,用来执行...

    使用Sql语句建Mssql库,建表

    例如,插入一条新记录可以使用`INSERT INTO`语句,查询数据可以使用`SELECT`语句,更新记录使用`UPDATE`,删除记录使用`DELETE FROM`。 了解了这些基础概念,你就能有效地利用SQL和易语言外部数据库接口进行MSSQL...

Global site tag (gtag.js) - Google Analytics