代码之家  ›  专栏  ›  技术社区  ›  Tom H zenazn

将SMO集合复制到PowerShell中的数组中

  •  1
  • Tom H zenazn  · 技术社区  · 14 年前

    我已经编写了一个PowerShell脚本,它将比较两个数据库,并在其中一个数据库中列出要删除的对象列表。我将这些项(作为具有名称和模式的自定义对象)放入数组中。

    在脚本的下一步中,我将遍历数据库中的对象,并查看它们是否与数组中的对象匹配。如果我找到一个匹配项,那么我继续从数据库中删除该对象。但是,我遇到的问题是,如果我尝试删除对象,那么我正在迭代的集合将被更改,并且我收到一条错误消息,说明集合已更改,发生这种情况时IEnumerable将无法工作。

    我试图复制集合,但似乎无法使用copy to方法将其塞入数组。有什么建议吗?

    我的当前代码如下。当我运行这个时,数组$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 回复  |  直到 11 年前
        1
  •  1
  •   Tom H zenazn    14 年前

    我要加上这个作为一个答案,以防将来有人需要这个。事实证明,我确实让事情变得比他们需要的更困难。因为我使用的是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)"
            }
        }
    }
    

    实际上,我还有一些代码可以与用户定义的函数进行比较,但是这些代码主要是从storedprocedures部分剪切粘贴的。