sql server 2005 T-SQL BULK INSERT (Transact-SQL)
以用戶指定的格式將數據文件導入數據庫表或視圖。
?Transact-SQL 語法約定
語法 BULK INSERT[ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]
FROM 'data_file'
[ WITH
(
[ [ , ] BATCHSIZE = batch_size ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ [ , ] DATAFILETYPE =
{ 'char' | 'native'| 'widechar' | 'widenative' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] LASTROW = last_row ]
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] TABLOCK ]
[ [ , ] ERRORFILE = 'file_name' ]
)] 參數 database_name
包含指定表或視圖的數據庫的名稱。如果未指定,則默認為當前數據庫。
表或視圖架構的名稱。如果用戶執行大容量導入操作的默認架構為指定表或視圖的架構,則 schema_name 是可選的。如果未指定 schema 并且用戶執行大容量導入操作的默認架構與指定表或視圖的架構不同,則 SQL Server 將返回一條錯誤消息,同時取消大容量導入操作。
要將數據大容量導入其中的表或視圖的名稱。只能使用其所有列均引用相同基表的視圖。有關向視圖中加載數據時有哪些限制的詳細信息,請參閱 INSERT (Transact-SQL)。
數據文件的完整路徑,該數據文件包含要導入到指定表或視圖中的數據。使用 BULK INSERT 可以從磁盤(包括網絡、軟盤、硬盤等)導入數據。
data_file 必須基于運行 SQL Server 的服務器指定有效路徑。如果 data_file 為遠程文件,則指定通用命名約定 (UNC) 名稱。
指定批處理中的行數。每個批處理作為一個事務復制至服務器。如果復制操作失敗,則 SQL Server 提交或回滾每個批處理的事務。默認情況下,指定數據文件中的所有數據為一個批處理。
有關詳細信息,請參閱管理大容量導入的批處理。
指定在大容量導入操作期間,必須檢查所有對目標表或視圖的約束。若沒有 CHECK_CONSTRAINTS 選項,則所有 CHECK 和 FOREIGN KEY 約束都將被忽略,并且在此操作之后表的約束將標記為不可信。
| 始終強制使用 UNIQUE、PRIMARY KEY 和 NOT NULL 約束。 |
有時您必須檢查整個表中的約束。如果在大容量導入操作之前表不為空,則重新驗證約束的代價可能會超出對增量數據應用 CHECK 約束的代價。
當輸入數據包含違反約束的行時,您可能希望禁用約束(默認行為)。禁用 CHECK 約束后,您可以導入數據并使用 Transact-SQL 語句刪除無效數據。
| MAXERRORS 選項不適用于約束檢查。 |
| 在 SQL Server 2005 中,BULK INSERT 強制執行新數據驗證和數據檢查,如果對某個數據文件中的無效數據執行這些操作,則可能導致現有腳本失敗。 |
有關詳細信息,請參閱通過大容量導入操作控制約束檢查。
指定該數據文件中數據的代碼頁。僅當數據含有字符值大于 127 或小于 32 的 char、varchar 或 text 列時,CODEPAGE 才適用。
| ACP | char、varchar 或 text 數據類型的列從 ANSI/Microsoft Windows 代碼頁 (ISO 1252) 轉換為 SQL Server 代碼頁。 |
| OEM(默認值) | char、varchar 或 text 數據類型的列從系統 OEM 代碼頁轉換為 SQL Server 代碼頁。 |
| RAW | 不進行從一個代碼頁到另一個代碼頁的轉換;這是最快的選項。 |
| code_page | 特定的代碼頁碼,例如 850。 |
有關詳細信息,請參閱在不同排序規則間復制數據。
指定 BULK INSERT 使用指定的數據文件類型值執行導入操作。
| char(默認值) | 字符格式。 有關詳細信息,請參閱使用字符格式導入或導出數據。 |
| 本機 | 本機(數據庫)數據類型。通過使用 bcp 實用工具從 SQL Server 大容量導入數據來創建本機數據文件。 與 char 值相比,本機值提供更高的性能。 有關詳細信息,請參閱使用本機格式導入或導出數據。 |
| widechar | Unicode 字符。 有關詳細信息,請參閱使用 Unicode 字符格式導入或導出數據。 |
| widenative | 本機(數據庫)數據類型,除了 char、varchar 和 text 列以外,列中的數據均被存儲為 Unicode。通過使用 bcp 實用工具從 SQL Server 大容量導入數據來創建 widenative 數據文件。 與 widechar 相比,widenative 值可以提供更高的性能。如果數據文件包含 ANSI 擴展字符,則指定 widenative。 有關詳細信息,請參閱使用 Unicode 本機格式導入或導出數據。 |
指定要用于 char 和 widechar 數據文件的字段終止符。默認的字段終止符是 \t(制表符)。有關詳細信息,請參閱指定字段終止符和行終止符。
指定要加載的第一行的行號。默認值是指定數據文件中的第一行。
| FIRSTROW 屬性不可用于跳過列標題。跳過行時,SQL Server 數據庫引擎只考慮字段終止符,而不考慮所跳過行的字段中的數據。 |
指定將在大容量導入操作期間執行目標表中定義的所有插入觸發器。如果在目標表中為 INSERT 操作定義了觸發器,則會對每個完成的批處理觸發觸發器。
如果沒有指定 FIRE_TRIGGERS,將不執行任何插入觸發器。
有關詳細信息,請參閱導入大容量數據時控制觸發器執行。
指定一個格式化文件的完整路徑。格式化文件用于說明包含存儲響應的數據文件,這些存儲響應是使用 bcp 實用工具在相同的表或視圖中創建的。在下列情況下應使用格式化文件:
- 數據文件包含的列多于或少于表或視圖包含的列。
- 列的順序不同。
- 列分隔符發生變化。
- 數據格式有其他更改。通常,使用 bcp 實用工具創建格式化文件并根據需要用文本編輯器進行修改。有關詳細信息,請參閱bcp 實用工具。
指定導入數據文件中的標識值用于標識列。如果沒有指定 KEEPIDENTITY,則此列的標識值可被驗證但不能導入,并且 SQL Server 將根據表創建時指定的種子值和增量值自動分配一個唯一的值。如果數據文件不包含該表或視圖中標識列的值,請使用一個格式化文件指定在導入數據時表或視圖中的標識列被忽略;SQL Server 自動為此列分配唯一的值。有關詳細信息,請參閱 DBCC CHECKIDENT (Transact-SQL)。
有關保留標識值的詳細信息,請參閱大容量導入數據時保留標識值。
指定在大容量導入操作期間空列應保留一個空值,而不插入用于列的任何默認值。有關詳細信息,請參閱在大容量導入期間保留空值或使用默認值。
將每個批處理中數據的近似千字節數 (KB) 指定為 kilobytes_per_batch。默認情況下,KILOBYTES_PER_BATCH 未知。
有關詳細信息,請參閱管理大容量導入的批處理。
指定要加載的最后一行的行號。默認值為 0,表示指定數據文件中的最后一行。
指定允許在數據中出現的最多語法錯誤數,超過該數量后將取消大容量導入操作。大容量導入操作未能導入的每一行都將被忽略并且計為一個錯誤。如果未指定 max_errors,則默認值為 10。
| MAX_ERRORS 選項不適用于約束檢查,也不適用于轉換 money 和 bigint 數據類型。 |
指定數據文件中的數據如何排序。如果根據表中的聚集索引(如果有的話)對要導入的數據排序,則可提高大容量導入的性能。如果數據文件按不同于聚集索引鍵的順序排序,或者該表沒有聚集索引,則忽略 ORDER 子句。提供的列名必須是目標表中有效的列名。默認情況下,大容量插入操作假設數據文件未排序。對于優化大容量導入,SQL Server 還將驗證導入的數據是否已排序。
有關詳細信息,請參閱大容量導入數據時控制排序順序。
指示可以指定多個列的占位符。
指示數據文件中近似的數據行數量。
默認情況下,數據文件中所有的數據都作為單一事務發送到服務器,批處理中的行數對于查詢優化器是未知的。如果指定了 ROWS_PER_BATCH(其值 > 0),則服務器將使用該值優化大容量導入操作。為 ROWS_PER_BATCH 指定的值應當與實際行數大致相同。
有關詳細信息,請參閱管理大容量導入的批處理。
指定對于 char 和 widechar 數據文件要使用的行終止符。默認行終止符為 \r\n(換行符)。有關詳細信息,請參閱指定字段終止符和行終止符。
指定為大容量導入操作持續時間獲取一個表級鎖。如果表沒有索引并且指定了 TABLOCK,則該表可以同時由多個客戶端加載。默認情況下,鎖定行為由表選項 table lock on bulk load 確定。在大容量導入操作期間持有鎖會減少表上的鎖爭用,從而顯著提高操作性能。
有關詳細信息,請參閱控制大容量導入的鎖定行為。
指定用于收集格式有誤且不能轉換為 OLE DB 行集的行的文件。這些行將按原樣從數據文件復制到此錯誤文件中。
錯誤文件是執行命令時創建的。如果文件已經存在則會發生錯誤。此外,還創建了一個擴展名為 .ERROR.txt 的控制文件。此文件引用錯誤文件中的每一行并提供錯誤診斷。糾正錯誤后即可加載數據。
有關為大容量導入準備數據的信息,請參閱準備用于大容量導出或大容量導入的數據。
BULK INSERT 語句能在用戶定義事務中執行。對使用 BULK INSERT 語句和 BATCHSIZE 子句將數據導入表或視圖(使用多個批處理)的用戶定義事務執行回滾操作,將回滾所有發送給 SQL Server 的批處理。
有關何時在事務日志中記錄由大容量導入執行的行插入操作的信息,請參閱在大容量導入中按最小方式記錄日志的前提條件。
在 SQL Server 2005 中,BULK INSERT 將對從文件中讀取的數據執行新的且更嚴格的數據驗證和數據檢查,因此,在對無效數據執行驗證和檢查時,可能導致現有腳本失敗。例如,BULK INSERT 現在驗證:
- float 或 real 數據類型的本機表示形式是否有效。
- Unicode 數據的字節數是否為偶數。
無效數據的形式在 SQL Server 的早期版本中可以大容量導入,但現在可能無法加載。在 SQL Server 的早期版本中,客戶端嘗試訪問無效數據時才會出錯。在大容量導入后查詢數據時,由 SQL Server 2005 強制使用的更為嚴格的驗證可最大程度地減少意外情況發生。
大容量導出或導入 SQLXML 文檔
若要大容量導出或導入 SQLXML 數據,請在格式化文件中使用下列數據類型之一:
| SQLCHAR 或 SQLVARYCHAR | 在客戶端代碼頁或排序規則隱含的代碼頁中發送數據。效果等同于在不指定格式化文件的情況下指定 DATAFILETYPE = 'char'。 |
| SQLNCHAR 或 SQLNVARCHAR | 以 Unicode 格式發送數據。效果等同于在不指定格式化文件的情況下指定 DATAFILETYPE = 'widechar'。 |
| SQLBINARY 或 SQLVARYBIN | 不經任何轉換即發送數據。 |
字符串到小數的類型轉換
在 SQL Server 2005 中,BULK INSERT 中使用的字符串到小數的類型轉換與 Transact-SQL CONVERT 函數遵循相同的規則,該函數拒絕使用表示使用科學記數法的數值的字符串。因此,BULK INSERT 將此類字符串視為無效值并報告轉換錯誤。
| 在 SQL Server 版本 7.0 和 SQL Server 2000 中,BULK INSERT 支持將使用科學計數法表示數值的字符串從字符串類型轉換為小數類型。 |
若要在 SQL Server 2005 中實現此行為,請使用格式化文件將科學記數法 float 數據大容量導入小數列中。在格式化文件中,顯式說明列作為 real 或 float 數據。有關這些數據類型的詳細信息,請參閱 float 和 real (Transact-SQL)。
| 格式化文件表示 real 數據作為 SQLFLT4 數據類型,以及 float 數據作為 SQLFLT8 數據類型。有關 XML 格式化文件的詳細信息,請參閱 XML 格式化文件的架構語法;有關非 XML 格式化文件的信息,請參閱使用 bcp 指定文件存儲類型。 |
導入使用科學記數法的數值的示例
該示例使用下表:
復制代碼 CREATE TABLE t_float(c1 float, c2 decimal (5,4))用戶要將數據大容量導入 t_float 表中。數據文件 C:\t_float-c.dat 包含科學記數法 float 數據,例如:
復制代碼 8.0000000000000002E-28.0000000000000002E-2但是,BULK INSERT 無法將該數據直接導入 t_float,原因是其第二列 c2 使用 decimal 數據類型。因此,必須使用格式化文件。格式化文件必須將科學記數法 float 數據映射到列 c2 的小數格式。
以下格式化文件使用 SQLFLT8 數據類型將第二個數據字段映射到第二列:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30"/> </RECORD> <ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8"/>
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8"/> </ROW> </BCPFORMAT>
若要使用此格式化文件(使用文件名 C:\t_floatformat-c-xml.xml)將測試數據導入測試表中,請發出下列 Transact-SQL 語句:
復制代碼 BULK INSERT bulktest..t_floatFROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');
GO 權限
需要 INSERT 和 ADMINISTER BULK OPERATIONS 權限。另外,當下列各項中的一項或多項為真時,還需要 ALTER TABLE 權限:
- 約束存在并且未指定 CHECK_CONSTRAINTS 選項。
注意: 禁用約束是默認行為。若要顯式檢查約束,請使用 CHECK_CONSTRAINTS 選項。 - 觸發器存在并且未指定 FIRE_TRIGGER 選項。
注意: 默認情況下,不觸發觸發器。若要顯式觸發觸發器,請使用 FIRE_TRIGGER 選項。 - 使用 KEEPIDENTITY 選項可以從數據文件中導入標識值。
安全帳戶委托(模擬)
如果 SQL Server 用戶使用 Windows 身份驗證登錄,則用戶僅能讀取其帳戶能夠訪問的文件,這不依賴于 SQL Server 進程的安全配置文件。
如果在一臺計算機上使用 sqlcmd 或 osql 執行 BULK INSERT 語句,將數據插入第二臺計算機上的 SQL Server,同時使用 UNC 路徑指定位于第三臺計算機上的 data_file,則可能會收到 4861 錯誤。
若要解決此問題,請使用 SQL Server 身份驗證并指定一個使用 SQL Server 進程帳戶安全配置文件的 SQL Server 登錄名,或者對 Windows 進行配置以啟用安全帳戶委托。有關如何使用戶帳戶可信以進行委托的信息,請參閱 Windows 幫助。
有關安全帳戶委托以及使用 BULK INSERT 的其他安全注意事項的詳細信息,請參閱使用 BULK INSERT 或 OPENROWSET(BULK...) 導入大容量數據。
示例A. 使用管道從文件導入數據
以下示例使用豎線 (|) 作為字段終止符,使用 |\n 作為行終止符,將訂單詳細信息從指定的數據文件導入 AdventureWorks.Sales.SalesOrderDetail 表中。
復制代碼 BULK INSERT AdventureWorks.Sales.SalesOrderDetailFROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR =' |\n'
)
B. 使用 FIRE_TRIGGER 參數
以下示例指定 FIRE_TRIGGERS 參數。
復制代碼 BULK INSERT AdventureWorks.Sales.SalesOrderDetailFROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR =' |',
ROWTERMINATOR = ':\n',
FIRE_TRIGGERS
)
C. 使用換行符作為行終止符
以下示例將導入使用換行符作為行終止符的文件(如 UNIX 輸出):
復制代碼 DECLARE @bulk_cmd varchar(1000)SET @bulk_cmd = 'BULK INSERT AdventureWorks.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC(@bulk_cmd)
其他示例
以下主題提供了其他 BULK INSERT 示例:
- 大容量導入和導出 XML 文檔的示例
- 在不同排序規則間復制數據
- 大容量導入數據時保留標識值
- 在大容量導入期間保留空值或使用默認值
- 指定字段終止符和行終止符
- 使用格式化文件大容量導入數據
- 使用字符格式導入或導出數據
- 使用本機格式導入或導出數據
- 使用 Unicode 字符格式導入或導出數據
- 使用 Unicode 本機格式導入或導出數據
- 使用格式化文件跳過表列
- 使用格式化文件將表列映射到數據文件字段
參考
OPENROWSET (Transact-SQL)sp_tableoption (Transact-SQL)
其他資源
準備用于大容量導出或大容量導入的數據用于導入或導出數據的數據格式
用來導入或導出數據的格式化文件
優化大容量導入性能
關于大容量導入和大容量導出操作
大容量導入和導出數據的方案
bcp 實用工具
使用 SQL 排序規則
使用表級鎖定并行導入數據 ?
轉載于:https://www.cnblogs.com/czh-liyu/archive/2007/12/22/1010268.html
總結
以上是生活随笔為你收集整理的sql server 2005 T-SQL BULK INSERT (Transact-SQL)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.1_ 1_ 初识文件管理
- 下一篇: JDBC链接SQLServer2005