清空数据库中所有表数据的方法

其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSForEachTable存储过程。

也许很多读者朋友都经历过这样的事情:要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。

说道删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失效,而且最要命的是这两个命令都只能一次操作一个表。那么真正遇到要删除SQL Server数据库中所有记录时,该怎么办呢?有两个选择:

1.按照先后顺序逐个删除,这个方法在表非常多的情况下显得很不现实,即便是表数量不多,但约束比较多时,你还是要花费大量的时间和精力去研究其间的约束关系,然后找出先删哪个表,再删哪个表,最后又删哪个表。

2.禁用所有约束,删除所有数据,最后再启用约束,这样就不用花时间和精力去研究什么约束了,只需要编写一个简单的存储过程就可以自动完成这个任务。

从这两个选择中不难看出第二个选择是最简单有效的了,那么在使用第二个选择时,具体该怎么实施呢?

首先得编写代码循环检查所有的表,这里我推荐一个存储过程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 ‘TRUNCATE TABLE ?’ — 截断表,比较快

EXEC sp_MSForEachTable ‘ALTER TABLE ? CHECK CONSTRAINT ALL’

EXEC sp_MSForEachTable ‘ALTER TABLE ? ENABLE TRIGGER ALL’

EXEC sp_MSForEachTable ‘SELECT * FROM ?’

GO

这个脚本创建了一个命名为sp_DeleteAllData的存储过程,前面两行语句分别禁用约束和触发器,第三条语句才是真正地删除所有数据,接下里的语句分别还原约束和触发器,最后一条语句是显示每个表中的记录,当然这条语句也可以不要,我只是想确认一下是否清空了所有表而已。

你可以在任何数据库上运行这个存储过程,当然不要在生成数据库上运行,可别怪我没告诉你!不管怎样,还是先备份一下数据库,使用备份数据库还原,然后再运行该存储过程,呵呵,即使是一个大型数据库,也要不多长时间,你的数据库就成一个空库了。

删除数据库快照

删除数据库快照将删除 SQL Server 中的数据库快照,并删除快照使用的稀疏文件.删除数据库快照时,将终止所有到此快照的用户连接.

具有 DROP DATABASE 权限的任何用户都可以删除数据库快照.

删除数据库快照

  1. 标识要删除的数据库快照.
  1. 执行 DROP DATABASE 语句,并指定要删除的数据库快照的名称.

此示例将删除名为 SalesSnapshot0600 的数据库快照,而不影响源数据库.

DROP DATABASE SalesSnapshot0600

 SalesSnapshot0600 的所有用户连接都被终止,并删除快照使用的所有 NTFS 文件系统稀疏文件

XML文件导入SQL Server

使用有道词典的童鞋们注意啦.

想问一下大家使用词典的生词本功能时有没有以下的困扰:

1.字体很丑;

2.打印出来格式很乱,设置成自己想要的格式太麻烦;

3.不能复制出来,每次查看都要在电脑上;

 

那么请看下面几步,轻松搞定.

1.选择生词本

 

2.选择导出选项

 

3.导出到某一路径下,:”D:/3.xml”

 

4.打开SQL Server,并执行以下脚本

— 创建保存但成本的数据库

CREATE DATABASE YouDaoWordList

GO

— 创建保存单词本的表

USE YouDaoWordList

GO

CREATE TABLE WordList

(word                VARCHAR(50),

 trans                VARCHAR(50) ,

 phonetic        NVARCHAR(50),

 tags                VARCHAR(50)

)

— 将XML文件导入到SQL Server中

DECLARE @h  int                — 定义xml句柄

DECLARE @doc  xml        — 定义xml对象

SELECT @doc = BulkColumn FROM OPENROWSET (BULK ‘C:/3.xml’, SINGLE_BLOB) AS xmlData        — 获得xml对象

EXECUTE sp_xml_preparedocument @h OUTPUT, @doc        — 获得xml句柄

— 插入表中

INSERT INTO WordList SELECT * FROM OPENXML(@h, ‘/wordbook/item’, 2) with WordList

EXECUTE sp_xml_removedocument @h        — 删除xml句柄

 

5.查询结果,如图所示

— 查询结果

SELECT word, phonetic, trans

FROM WordList

ORDER BY word

GO

 

6.现在就可以复制出来到Word或者Excel,编辑成自己喜欢的格式,打印出来随时翻阅了.

使用TOP限制删除的行

可以使用 TOP 子句限制 DELETE 语句中删除的行数. TOP (n子句与 DELETE 一起使用时,将针对随机选择的第 n 执行删除操作.

例如,下面的语句从 PurchaseOrderDetail 表中删除了其到期日期早于 2002  7  1 日的 20 个随机行.

USE AdventureWorks2008R2;

GO

DELETE TOP (20)

FROM Purchasing.PurchaseOrderDetail

WHERE DueDate < ‘20020701’;

GO

如果需要使用 TOP 来删除按有意义的时间顺序排列的行,您必须同时使用 TOP  ORDER BY 子句.下面的查询从PurchaseOrderDetail 表中删除了其到期日期最早的 10 .为了确保仅删除 10 ,嵌套 Select 语句(PurchaseOrderID) 中指定的列将成为表的主键.如果指定列包含重复的值,则在嵌套 Select 语句中使用非键列可能会导致删除的行超过 10 .

USE AdventureWorks2008R2;

GO

DELETE FROM Purchasing.PurchaseOrderDetail

WHERE PurchaseOrderDetailID IN

(SELECT TOP 10 PurchaseOrderDetailID

FROM Purchasing.PurchaseOrderDetail

ORDER BY DueDate ASC);

GO

如何更改对象所属的架构

如何在架构之间传输安全对象?

语法:ALTER SCHEMA schema_name TRANSFER securable_name

参数

1.schema_name:当前数据库中的架构名称,安全对象将移入其中。其数据类型不能为 SYS INFORMATION_SCHEMA

2.securable_name:要移入架构中的架构包含安全对象的一部分或两部分名称

备注

用户与架构完全分离。有关详细信息,请参阅用户架构分离。

ALTER SCHEMA 仅可用于在同一数据库中的架构之间移动安全对象。若要更改或删除架构中的安全对象,请使用特定于该安全对象的 ALTER 或 DROP 语句。

如果对 securable_name 使用了由一部分组成的名称,则将使用当前生效的名称解析规则查找该安全对象。

将安全对象移入新架构时,将删除与该安全对象关联的全部权限。如果已显式设置安全对象的所有者,则该所有者保持不变。如果安全对象的所有者已设置为 SCHEMA OWNER,则该所有者将保持为 SCHEMA OWNER;但移动之后,SCHEMA OWNER 将解析为新架构的所有者。新所有者的 principal_id 将为 NULL。

注意:从 SQL Server 2005 开始,架构的行为发生了更改。因此,假设架构与数据库用户等价的代码不再返回正确的结果。包含 sysobjects 的旧目录视图不应在曾经使用任何下列 DDL 语句的数据库中使用:CREATE SCHEMA、ALTER SCHEMA、DROP SCHEMA、CREATE USER、ALTER USER、DROP USER、CREATE ROLE、ALTER ROLE、DROP ROLE、CREATE APPROLE、ALTER APPROLE、DROP APPROLE、ALTER AUTHORIZATION。在这类数据库中,必须改用新目录视图。新的目录视图将采用在 SQL Server 2005 中引入的使主体和架构分离的方法

权限

若要从另一个架构中传输安全对象,当前用户必须拥有对该安全对象(非架构)的 CONTROL 权限,并拥有对目标架构的 ALTER 权限。

如果已为安全对象指定 EXECUTE AS OWNER,且所有者已设置为 SCHEMA OWNER,则用户还必须拥有对目标架构所有者的 IMPERSONATION 权限。

在移动安全对象后,将删除与所传输的安全对象相关联的所有权限。

示例

以下示例通过将表 Address 从架构 Person 传输到 HumanResources 架构来修改该架构。

USE AdventureWorks;
GO
ALTER SCHEMA HumanResources TRANSFER Person.Address;
GO