在Powershell中将SMO集合复制到数组中

时间:2010-08-06 16:50:00

标签: arrays collections powershell smo

我编写了一个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 个答案:

答案 0 :(得分:1)

我将此作为答案添加,以防万一其他人将来需要这个。事实证明,我真的比他们需要的更难。由于我使用的是Powershell,因此“where”函数优于迭代存储过程。

以下是解决我的问题的代码:

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部分的剪切和粘贴。