SQL "SELECT INTO/BULKCOPY" 的用法

孙项禹
2023-12-01

昨天看了一下EntLib3中的模块Data部分时,看到一个script.有个系统存储过程票了一眼.sp_dboption的存储过程.这个是什么设置.

原来是配置数据库属性的.运行了一下exec sys.sp_dboption.有26个属性可以设置,当看到select into/bulkcopy的时候.很亲切,因为这个

属性用过好几次,想测试一下.这个按照msdn上的属性是阻止对数据库进行select into.

 

   use master

   exec sys.sp_dboption  '数据库名','select into/bulkcopy',true/false

 

    运行成功后,我测试了下面语句

   use whtai

   select * into sp7 from student where 1=2
   奇怪,怎么可以通过,我已经false掉了.怎么还可以select into.没有道理啊.没办法.

看了一下系统的存储过程sys.sp_dboption.看了一下,怎么最后变成了.

ALTER DATABASE [whtai] SET RECOVERY simple WITH NO_WAIT

其中whtai是数据库名,simple 是恢复模式.在系统存储过程把参数中的true/false 变成了full/bulk_logged.

怎么跟看到的解释不一样.

 

接下来测试了一下.

数据库的恢复模式是simple .

运行

use master

   exec sys.sp_dboption  '数据库名','select into/bulkcopy',true/false

不起作用.

当我把数据库的恢复模式改为full.或者bulk_logged 的时候,起作用了.参数中的true,对应的恢复模式是full. false 对应bulk_logged

 

当我在msnd

http://technet.microsoft.com/zh-cn/library/ms188029.aspx

上看到into子句的解释时.这才了解:

 

SELECT...INTO 的日志记录量取决于对数据库有效的恢复模式。在简单恢复模式或大容量日志恢复模式下,大容量操作是最小日志记录操作。对于按最小方式记录日志,使用 SELECT… INTO 语句可能比创建一个表后使用 INSERT 语句填充该表效率更高。

 

使用最小日志记录插入行

下面的示例创建 dbo.NewProducts 表并从 Production.Product 表插入行。此示例假定 AdventureWorks 数据库的恢复模式设置为 FULL。若要确保最小方式记录,应在插入行之前将 AdventureWorks 数据库的恢复模式设置为 BULK_LOGGED,并在 SELECT...INTO 语句后重置为 FULL。此过程确保 SELECT...INTO 语句在事务日志中占用最少的空间并且高效执行。

 

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks SET RECOVERY BULK_LOGGED;
GO

SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks SET RECOVERY FULL;
GO

这是msdn上的一个例子.通过例子我们看到select into/bulkcopy是设置恢复模式的.通过设置数据库的恢复模式,使得在使用
select into 语句的时候.事务的日志量达到最少.

可是有没有这样的设定,限制对一个数据库进行 select into .期待高手回复.








 类似资料: