Копирование коллекции SMO ​​в массив в Powershell - PullRequest
1 голос
/ 06 августа 2010

Я написал скрипт Powershell, который сравнивает две базы данных и предлагает список объектов в одной из баз данных, которые нужно удалить. Я помещаю эти элементы (как настраиваемый объект с именем и схемой) в массив.

На следующем шаге моего сценария я перебираю объекты в базе данных и проверяю, соответствуют ли они объекту в моем массиве. Если я нахожу совпадение, тогда я выбрасываю объект из своей базы данных. Однако проблема, с которой я столкнулся, заключалась в том, что если я пытаюсь отбросить объект, то коллекция, через которую я перебираю, изменяется, и я получаю сообщение об ошибке, что коллекция изменилась, и IEnumerable не будет работать, когда это произойдет.

Я пытался сделать копию коллекции, но я не могу поместить ее в массив, используя метод CopyTo. Есть предложения?

Мой текущий код ниже. Когда я запускаю это, массив $ sprocs пуст.

function DropSQLObjects
{
 param([object]$database, [object]$objectsToDrop)

 $sprocs = @()
 $database.StoredProcedures.CopyTo($sprocs, 0)

 # If I do a $sprocs | out-host I see that the array is still empty

 foreach ($objectToDrop in $objectsToDrop)
 {
  foreach ($sproc in $sprocs)
  {
   if ($sproc.Name -eq $objectToDrop.Name -and $sproc.Schema -eq $objectToDrop.Schema)
   {
    $sproc.Drop()
    LogToSQL $database "Dropped Stored Procedure: $($objectToDrop.Schema).$($objectToDrop.Name)"
   }
  }
 }
}

1 Ответ

1 голос
/ 06 августа 2010

Я добавляю это как ответ на случай, если кому-то еще понадобится это в будущем.Оказывается, я действительно делал вещи сложнее, чем они должны были быть.Поскольку я использовал Powershell, функция «где» была лучше, чем итерация хранимых процедур.

Вот код, который решил мою проблему:

function DropSQLObjects
{
    param([object]$database, [object]$objectsToDrop)

    foreach ($objectToDrop in $objectsToDrop)
    {
        if ($database.StoredProcedures.Contains($objectToDrop.Name, $objectToDrop.Schema))
        {
            $sproc = $database.StoredProcedures | where {$_.Schema -eq $objectToDrop.Schema -and $_.Name -eq $objectToDrop.Name}
            $sproc.Drop()
            LogToSQL $database "Dropped Stored Procedure: $($objectToDrop.Schema).$($objectToDrop.Name)"
        }
    }
}

На самом деле у меня также есть кодидти против UserDefinedFunctions, но код в основном вырезан и вставлен из части StoredProcedures.

...