2016-02-17 85 views
0

我正在使用SMO與PowerShell腳本一起執行一些SQL Server編程。下面列出了我的腳本的簡化版本。SQL Server SMO編程,在哪裏設置CommandTimeout屬性?

# Load SMO assembly, and if we're running SQL Server 2008 DLLs load the SMOExtended and SQLWMIManagement libraries 
$v = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO"); 

if ((($v.FullName.Split(','))[1].Split('='))[1].Split('.')[0] -ne '9') { 
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMOExtended") | out-null; 
} 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SmoEnum') | out-null; 
$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") ".\sql2014"; 
$server.Databases["master"].ExecuteWithResults("select * from sys.database_files"); 
現在

我的劇本總是超時,我用Google搜索周圍對互聯網和發現,我應該在我的代碼設置CommandTimeout property地方。

然而,物業CommandTimeoutSqlCommand。我使用SMO執行查詢的方式沒有SqlCommand對象。正如你所看到的,我可以直接在$server.Databases["master"]上執行。

誰能幫助指出我應該設置CommandTimeout財產?

謝謝。

+1

幾個樣式註釋 - 嘗試'import-module SQLPS -DisableNameChecking'而不是所有反射的LoadWithPartialName東西。另外,如果你打算最終選擇數據文件,實際上使用SMO模型:數據庫有FileGroups,FileGroups又有文件。數據庫也有LogFiles。但最終,你想使用這些東西的對象表示,而不是試圖解析你的即席查詢的輸出。 –

回答

1

$server.ConnectionContext.StatementTimeout應該會爲你所做的工作。按照這個:

獲取或設置語句在發生超時錯誤失敗之前運行的秒數。

+0

我測試此使用'WAITFOR DELAY '00:00:05''設置'$ server.ConnectionContext.StatementTimeout'等於1造成它失敗,但將其設置爲6允許它成功;所以這個值是以秒爲單位的。 –