在将记录插入数据库时​​将数组拆分为powershell

时间:2017-06-14 12:06:16

标签: powershell

我正在编写powershell脚本来读取数据库服务器列表上的SQL实例名称。

到目前为止,我已经加倍了。

  1. 通过建立连接从SQL数据库中读取服务器名称。
  2. 读取服务器上的注册表项值并返回实例名称。
  3. 将结果插回到具有servername vs instance name的表(**每个服务器可能有多个实例**)
  4. 当只有一个实例名称但是从注册表返回多个实例时,我的脚本正在按预期工作,我的变量是将孔数组作为单个值插入表中。

    我的结果如下所示,我不想要

    SVC_Server SVC_Instnace
    Server1    MSSQLSERVER
    Server2    MSSQLSERVER INST1
    Server3    MSSQLSERVER INST1 INST2
    

    我期待这样的结果

    SVC_Server SVC_Instnace
    Server1    MSSQLSERVER
    Server1    INST1
    Server2    MSSQLSERVER
    Server2    INST1
    Server3    MSSQLSERVER
    Server3    INST1 
    Server3    INST2
    

    我尝试了以下方法来处理,但没有运气。

    1. 创建了foreach循环:这将读取在try block
    2. 中限定的服务器名称
    3. For-each服务器根据实例长度执行for循环执行
    4. 尝试使用拆分但没有运气。
    5. 我在powershell的学习阶段......我很感激你的帮助。

      $Tsql = "SELECT svr_name  FROM server"
          $ServerList = Invoke-Sqlcmd -Query $Tsql -ServerInstance $sql_inst -Database $sql_db 
          $Servers = $ServerList.Svr_name   
        # ECHO $Servers
       foreach($Server in $Servers)
      
       {
       try 
       {
      
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Localmachine', $Server)
        $regKey= $reg.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server" )
      
        If ($regKey.GetSubKeyNames() -contains 'Instance Names' -or $regKey.GetValueNames() -contains 'InstalledInstances' ) 
           {
         $instances = $regKey.GetValue('InstalledInstances')
         #ECHO $instances
           } 
        ElseIf ($regKey.GetValueNames() -contains 'Instance Names') 
         {
      
      
         $regKey= $reg.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL" ) 
           $instances = @($regkey.GetValueNames())
         } 
      
       foreach($Srv in $Server)
        {
      
        if ($instances.count -gt 1) {
            for($i=0; $i -ge $instances.Length ;$i++)
               {
                 Invoke-SQLCMD -Query "INSERT INTO [dbo].[SVC_Instance] ([SVC_Server],[SVC_Instance]) VALUES  ( ('$Server'),('$instances[i]')) " -Database $sql_db -ServerInstance $sql_inst
                 ECHO  $Server
                 ECHO $instances
                }
      
             }
        else 
        {   
        Invoke-SQLCMD -Query "INSERT INTO [dbo].[SVC_Instance] ([SVC_Server],[SVC_Instance]) VALUES  ( ('$Server'),('$instances')) " -Database $sql_db -ServerInstance $sql_inst }
        ECHO 'Else is executed'
        }
        #ECHO $Server 
        #ECHO $instances
      
        }
      
       Catch
        {
      
        "Something wrong with  : $Server " | Out-file 'C:\ServerPatching\Failed_Servers.txt' -Append
         #ECHO $Server 
        }
        # ECHO $instances
      
      
      
      
         }
      
         }
      

1 个答案:

答案 0 :(得分:0)

foreach($ Srv in $ Server)   {

最后它对我有用,如下所示。感谢

      foreach($inst in $instances)

      { 
      Invoke-SQLCMD -Query "INSERT INTO [dbo].[SVC_Instance] ([SVC_Server],[SVC_Instance]) VALUES  ( ('$Server'),('$inst')) " -Database $sql_db -ServerInstance $sql_inst


       }