SQL "SELECT INTO/BULKCOPY" 的用法

昨天看了一下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 .期待高手回覆.









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章