2016-02-17 5 views
0

Я работаю над скриптом PowerShell с SMO для программирования SQL Server. Ниже приведена упрощенная версия моего сценария.Программирование SMO SQL Server, где установить свойство 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"); 

Теперь мой скрипт всегда раз, и я гугл вокруг против интернета и нашел, что я должен установить CommandTimeout property где-то в моем коде.

Однако имущество CommandTimeout предназначено для оплаты: SqlCommand. То, как я использую SMO для выполнения запроса, не имеет объекта SqlCommand. Как вы можете видеть, я могу выполнить непосредственно на $server.Databases["master"].

Может ли кто-нибудь помочь указать, где я должен установить CommandTimeout?

Спасибо.

+1

Несколько комментариев стиля - попробуйте 'import-module SQLPS -DisableNameChecking' вместо всего, что отражает LoadWithPartialName. Кроме того, если вы собираетесь в конечном итоге выбирать файлы данных, на самом деле используйте модель SMO: в базах есть FileGroups, которые, в свою очередь, имеют файлы. Базы данных также имеют LogFiles. Но в конечном итоге вы хотите использовать представление объектов этих вещей, а не пытаться проанализировать вывод своего специального запроса. –

ответ

1

$server.ConnectionContext.StatementTimeout должен выполнить эту работу за вас. В соответствии с это:

Получает или задает количество секунд, которые оператор выдает для запуска до сбоя с ошибкой тайм-аута.

+0

Я протестировал это, используя 'WAITFOR DELAY '00: 00: 05'', чтобы установить' $ server.ConnectionContext.StatementTimeout' равным 1, из-за чего он потерпел неудачу, но установив его на 6, он преуспел; поэтому значение находится в секундах. –

Смежные вопросы