這是我的自定義解決方案。它只是一個可以執行巨大的.sql文件的powershell腳本。
$filePath = "GiganticFile.sql";
$stream = [System.IO.File]::OpenText($filePath);
$connection = New-Object System.Data.SqlClient.SqlConnection;
$connection.ConnectionString = "Persist Security Info=True;User ID=<user>;Password=<password>;Initial Catalog=<database>;Data Source=<server>";
$connection.Open();
$command = New-Object System.Data.SqlClient.SqlCommand;
$command.Connection = $connection;
$statement = "";
$statementsProcessed = 0;
$totalBytes = (New-Object System.IO.FileInfo($filePath)).Length;
$bytesProcessed = 0;
while (-not $stream.EndOfStream) {
$line = $stream.ReadLine();
$bytesProcessed += $line.Length;
if ($line.Trim() -eq "GO") {
try {
$command.CommandText = $statement;
[void]$command.ExecuteNonQuery();
$statement = "";
"{0} statements processed ({1:f} MB) - {2:f}%" -f (++$statementsProcessed), ($bytesProcessed/1024/1024), ($bytesProcessed/$totalBytes * 100);
}
catch {
"!!! ERROR !!!";
$Error;
}
}
else {
$statement += $line + [Environment]::NewLine;
}
}
$stream.Close();
輸出樣本:
137238 statements processed (544.54 MB) - 7.57%
137239 statements processed (544.55 MB) - 7.57%
137240 statements processed (544.56 MB) - 7.57%
137241 statements processed (544.57 MB) - 7.57%
137242 statements processed (544.58 MB) - 7.57%
137243 statements processed (544.59 MB) - 7.57%
137244 statements processed (544.60 MB) - 7.57%
137245 statements processed (544.61 MB) - 7.57%
137246 statements processed (544.63 MB) - 7.58%
137247 statements processed (544.64 MB) - 7.58%
137248 statements processed (544.65 MB) - 7.58%
137249 statements processed (544.66 MB) - 7.58%
137250 statements processed (544.67 MB) - 7.58%
137251 statements processed (544.68 MB) - 7.58%
137252 statements processed (544.69 MB) - 7.58%
137253 statements processed (544.70 MB) - 7.58%
你的問題不是SQLCMD,那就是你有一個單條8GB SQL腳本。我知道將所有東西放在一個地方進行部署可能會很好(我認爲這是您的目標),但根本無法維護和排除故障。爲什麼不把它分成多個文件,每個對象或每個對象類型(tables.sql等),並有一個包裝腳本來執行它們呢? – Pondlife 2012-07-27 20:24:28
最好是在生成腳本時修復SSMS的問題,而不是忽略其中包含'%'和'('的語句。是不是真正的問題,當數據包含SSMS腳本時,如何生成可運行的插入語句'%'或者'('?' – 2012-07-27 20:56:11
@ Code12:你的文件是否需要實際的SQL語句?如果沒有,還有其他方法可以提取模式和數據,以使大小不應該成爲問題,數據本身應該沒問題,因爲它會以二進制格式。我在考慮SQL Server數據工具(SSDT)(http://msdn.microsoft.com/zh-cn/data/gg427686)。它是免費的,可以掛接到Visual Studio Express(也是免費的),並允許您將所有或部分表(帶或不帶數據)提取到可通過另一個連接字符串導入的二進制'.dacpac'文件中。 – 2014-09-26 20:20:45