#sql-server #powershell
#sql-сервер #powershell
Вопрос:
Я хочу автоматизировать перестройку или реорганизацию индекса в нескольких экземплярах и базах данных с помощью powershell. У меня есть запрос ниже:
$SQLInstances = "Server1", "Server2", "Server3"
$Databses = "Db1", "Db2", "Db3"
Foreach ($SQLInstance in $SQLInstances) {
foreach ($DbName in $Databses)
{
Invoke-Sqlcmd -ServerInstance $SQLInstance -Database $DBName -Query $IndexQuery
}
}
Значение переменной $IndexQuery равно
USE master
EXECUTE dbo.IndexOptimize @Databases = '$DBName',
@FragmentationLow = NULL,
@FragmentationMedium =
'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh =
'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
По некоторым причинам этот код не работает. Он выполняется без ошибок, но не выполняет перестройку или реорганизацию индексов. Проблема не в sql-запросе, потому что он отлично работает в SSMS, но проблема в моем сценарии powershell. Есть идеи?
Комментарии:
1. Что вы подразумеваете под «ничего не делать с индексами»? Какое значение
$IndexQuery
? Какова цель указанного SQL в$IndexQuery
?2. @Larnu Я отредактировал свой вопрос. Эта переменная содержит sql-запрос, который вызывает хранимые процедуры, но проблема не в части sql, а во вложенном foreachloop
3. Похоже, вы используете скрипты Олы Халенгрена. В параметре уже можно указать несколько баз
Databases
данных. Вам вообще не нужен цикл4. Где вы определяете
$IndexQuery
? Как написано, он может работать правильно, только если он назначен в цикле (поэтому$DBName
заменяется).5. OP пытается выполнить несколько баз данных и серверов, @PanagiotisKanavos .