文章轉載自:http://blog.sina.com.cn/s/blog_3eec0ced0100mhm2.html
最近經常用到超過80M *.sql文件的導入問題。
上網找了一下,發現超過80M的文件是不能在查詢分析器中執行的。
?
找了些解決方案,個人感覺最簡單的方法就是這個SQLCMD的,拿出來分享一下,也方便日后自己使用。
下面的內容是詳細介紹sqlcmd的,有興趣的朋友可以看看
?
?
因為公司的業務需要,所以采集了一個2W多條的數據,都是insert語句,生成一個200多M的數據,誰料在通過sql server 2005不能直接打開,導入也存在問題,用記事本也打不開,復制貼也不行,最后還是一同學提了個醒用命令在dos下執行.sql文件,才有了辦法,同時也 在一熱心網友的幫助下完成了這個讓我頭疼半天的活,下面我對這些做一下介紹,應該對有這樣需要的朋友很好的幫助。
如果裝的是2000版的sql那用的命令是osql,05的用sqlcmd
其實用法很簡單,任何技術,一旦說穿就失去了它的神秘,這有點像生活中的很多事,好了廢話了半天,還是切入正題,開工吧:
其實就是一句很簡單的話句:
sqlcmd -i sqlfile.sql -d databasename -s 127.0.0.1
這個sql文件要放在c:\下
就這么簡單..
sqlcmd 使用筆記
登錄sqlcmd
命令 sqlcmd -S 服務器名稱 -U 帳戶 -P 密碼
示例 sqlcmd -S "HOMESQLEXPRESS" -U "sa" -P "12345678"
直接執行SQL Script
命令 sqlcmd -S 服務器名稱 -U 帳戶 -P 密碼 -d 數據庫 -i SQL Script
示例 sqlcmd -S "HOMESQLEXPRESS" -U "sa" -P "12345678" -d "Database" -i "E:My Documentstest.sql"
查詢當前服務器上的數據庫
(*) 可能需要 Use Master
1. Select [Name] From sysdatabases
2. sp_helpdb
查詢當前數據庫的表和存儲過程
表:select * from sysobjects where status >=0 and xtype='U'
存儲過程:select * from sysobjects where status >=0 and xtype='P'
------------------------
1、你可以用SQLCMD執行交互式動作,如:
C:\sqlcmd>sqlcmd
1> SELECT name from sys.databases
2> GO
你也可以試著鍵入如下命令,現實服務器列表
1>:ServerList
SERVERS:
WUYZ
1>如果想看其他命令的使用,可以鍵入:Help /?
2、執行SQL腳本文件
你可以在SQLCMD命令上加入參數I來執行SQL腳本文件,例如:
C:\sqlcmd>sqlcmd -i test.sql
上面的I選項允許你執行一個腳本文件,另外,你也可以指定O選項,把命令的輸出導出到指定文件,當然,我們也可以在代碼中指定輸出結果,如下
C:\sqlcmd>sqlcmd
1> :out output.txt
2> :r test.sql
3、在腳本中使用變量
SQLCMD支持可以在腳本中接收用戶傳入的變量信息,如下面語句:
SET NOCOUNT ON
Select $(Cols) from $(tablename)
GO
上面語句請求2個參數,我們可以通過指定相應的參數信息傳給腳本,如下:
C:\sqlcmd>sqlcmd -i test.sql -o Output.txt -v cols="name,object_id,create_date" tablename="sys.objects"
上面語句的用途是:執行TEST.SQL腳本文件,并把輸出的信息輸出到OUTPUT.TXT文件中,并分別指定了COLS,TABLENAME的參數值
4、在腳本中設置變量的值
除了通過外部傳入參數的值外,還可以在內部設置參數的值,如下面例子
e:\sqlcmd\backuptemplate.sql
use master
backup database [$(db)] to disk='$(file)'
e:\sqlcmd\backupsingle.sql
:setvar db msdb
:setvar file c:\temp\msdb.bak
:r e:\sqlcmd\backuptemplate.sql
如果你想知道當然定義了哪些變量,可以使用:listvar命令來顯示。主要命令匯總:
:r filename
:ServerList
:List
:Listvar
:Error filename | STDOUT | STDERR
:Out filename | STDOUT | STDERR
:Perftrace filename | STDOUT | STDERR
:Connect server[\instance] [timeout] [user_name[password] ]
:On Error [exit | ignore]
:SetVar variable value
:Help:XML ON | OFF
主要環境變量匯總:
-a SQLCMDPACKETSIZE
-d SQLCMDDBNAME
-H SQLCMDWORKSTATION
-h SQLCMDHEADERS
-l SQLCMDLOGINTIMEOUT
-m SQLCMDERRORLEVEL
-P SQLCMDPASSWORD
-S SQLCMSSERVER
-s SQLCMDCOLSEP
-t SQLCMDSTATTIMEOUT
-U SQLCMDUSER
-w SQLCMDCOLWIDTH
------------------------
T-SQL還原數據庫備份
restore database TionkDatabase from disk='E:\@工作\訊客\項目\訊客直銷\代碼\db20080521'
width move "源文件" to "目標文件位置"
------------------------
使用 T-SQL 執行還原
RESTORE 命令有兩種形式顯示如下:
RESTORE DATABASE 還原完整的資料庫、檔案或檔案群組。
RESTORE LOG 還原交易記錄檔。
RESTORE 陳述式
執行完整資料庫還原時 RESTORE 陳述式的語法如下:
RESTORE DATABASE database_name
[ FROM backup_device ]
[ WITH options ]
這個陳述式只要求資料庫的檔案名稱和備份所在的位置。
執行檔案和檔案群組還原時陳述式的語法如下:
RESTORE DATABASE database_name
[ FILE = file_name ]
[ FILEGROUP = filegroup_name ]
[ FROM backup_device ]
[ WITH options ]
這個陳述式只要求資料庫名稱、檔案名稱或檔案群組名稱和備份所在的位置。
執行交易記錄還原時陳述式的語法如下:
RESTORE LOG database_name
[ FROM backup_device ]
[ WITH options ]
就如同其他的命令,database_name 是還原將要執行的資料庫名稱。backup_device 參數可以是邏輯備份裝置名稱或實體裝置的名稱。如果要指定一個實體裝置,必須限定它的裝置類型-也就是說,裝置名稱前面必須加上 DISK=、TAPE= 或 PIPE=。可以指定一個或多個裝置,中間以逗號隔開。
如果沒有提供 FORM 子句,還原將無法進行,而且仍然會執行回復(除非執行NORECOVERY 選項)。這項技術可以用來將資料庫設定為回復模式,而不還原其他附加資料。例如,可以執行多個差異還原操作,然后執行 RESTORE 陳述式,不需要 FORM 子句來將資料庫設定為回復模式,就能夠啟動回復過程。
選項
選項????????????????????????說明
RESTRICTED_USER?????????????設定新還原資料庫的安全性,只有 db_owner、dbcreater 和 sysadmin 角色成員才能存取該資料庫。
FILE = file_number??????????如果在儲存媒體中有多個備份集,可用來識別所使用的備份集。例如設定該數值為2,則使用磁帶上的第二個備份集。
PASSWORD = password?????????指定儲存備份的密碼。
MEDIANAME =media_name???????指定媒體的名稱。
MEDIAPASSWORD = password????指定儲存媒體的密碼。
MOVE 'logical_file_name' TO 'OS_file_name'
更改還原檔案的位置,例如:MOVE 'Northwind' TO 'D:\data\Northwind.mdf'。如果舊的磁碟無法使用,而需要還原到新的磁碟上時,可以使用這個選項。
NORECOVERY |RECOVERY | STANDBY = undo_file
NORECOVERY 指定在還原后,交易將無法退回或重新進行。如果將還原其他的備份(差異式備份或交易記錄檔備份),則需要用到這個選項。REVOVERY 為預設選項,它指定執行回復操作,并退回每個沒有提交的變更。STANDBY 指定在還原需要還原情況下,建立還原(undo)檔案。
KEEP_REPLICATION 指定當資料庫還原時復制設定要保存下來。
NOUNLOAD | UNLOAD NOUNLOAD 指定在還原完成后不卸載儲存媒體(例如,覆寫備份磁帶并彈出)。UNLOAD 為預設選項,指定在還原完成后卸載儲存媒體。
REPLACE 指出即使資料檔案已經存在,SQL Server 仍將還原這些檔案。現存的檔案將被刪除和覆寫。如果沒有指定 REPLACE,那麼 SQL Server 將會核對 database_name 是否已經存在。如果已經存在,那麼將終止還原操作。這個安全特性幫助避免無意地將還原覆寫正在工作的資料庫。
RESTART 指定 SQL Server 在還原操作被中斷后重新啟動還原操作。
STATS [ = percentage ] 在還原操作完成了指定的百分率后顯示訊息。如果需要監控操作的過程,這個選項將會很有用。
PARTIAL 指定執行部份還原。
STOPAT = date_time
(log restore only)?www.koogoogle.cn/whois
指定資料庫回復到 data_time 指定時刻的資料狀態(只對記錄檔還原有效)。
STOPATMARK = 'mark' 指定還原操作進行到標記處。
STOPBEFOREMARK = 'mark' 指定還原操作進行到標記之前。
?
通過System.Data.SqlClient命名空間只能執行單條SQL,或多個內容中間用;分開,不能執行類似等命令,有沒有一種方法能類似查詢分析器一樣執行一些批命令呢,答案是通過OSQL來執行。
OSQL詳細用法:http://technet.microsoft.com/zh-cn/library/ms162806.aspx
通地進程來調用:
?

?2?????????///?執行OSQL命令
?3?????????///?</summary>
?4?????????public?static??void?ExcuteOsqlCmd(string?cmd,?string?errorFile,?string?filePath)
?5?????????{
?6??????????????System.Diagnostics.Process?p?=?new?System.Diagnostics.Process();
?7?
?8??????????????p.StartInfo.FileName?=?"osql";
?9??????????????p.StartInfo.Arguments?=?cmd;
10??????????????p.StartInfo.UseShellExecute?=?false;
11?
12??????????????p.StartInfo.RedirectStandardError?=?true;
13??????????????p.StartInfo.CreateNoWindow=true;
14??????????????p.Start();
15??????????????p.WaitForExit();
16?????????????//p.Close();
17?????????????int?exitCode?=?p.ExitCode;
18?????????????if?(exitCode?!=?0)
19?????????????{
20??????????????????StreamReader?sr?=?new?StreamReader(errorFile,?System.Text.Encoding.Default);
21?????????????????string?all?=?sr.ReadToEnd();
22??????????????????sr.Close();
23?????????????????//ExcuteOtherCmd(string.Format("notepad?\"{0}\"",?errorFile));
24?????????????????throw?new?StepException(all);
25??????????????}
26??????????}
?調用如下:
string comm = string.Format(" -U {5} -P {0} -S {1} -d {2} -b -e -i \"{3}\" -o \"{4}\"", pass,
?????????????????????????????????????????conn.DataSource,
?????????????????????????????????????????conn.Database,
?????????????????????????????????????????FilePath, errorFile,user);
Process.ExcuteOsqlCmd(comm, errorFile, FilePath);//直接執行一個SQL文件,路徑為FilePath