2010-10-26 25 views
6

Tengo un servidor SQL 2008 Ent con las bases de datos "DBOne", "DBTwo", "DBThree" en el servidor DEVSQLSRV.Devolver consulta SQL como matriz en Powershell

Aquí está mi script de PowerShell:

$DBNameList = (Invoke-SQLCmd -query "select Name from sysdatabases" -Server DEVSQLSRV) 

Esto produce mi lista deseada de los nombres de bases de datos como:

Name 
----- 
DBOne 
DBTwo 
DBThree 

I ha sido mi suposición de que cualquier cosa que se devuelve como una lista es una matriz en Powershell. Sin embargo, cuando luego tratar esto en Powershell:

$DBNameList -contains 'DBTwo' 

se trata de volver tiene "falso" en lugar de "True" que me está dando lugar a creer que mi lista no es una matriz real.

¿Alguna idea de lo que me falta aquí?

¡Muchas gracias!

emotivo cabecera

Respuesta

9

que haría esto:

$DBNameList = @(Invoke-SQLCmd -query "select Name from sysdatabases" -Server DEVSQLSRV) | select-object -expand Name 

que le dará una gran variedad de opciones names.The -contains debería funcionar bien.

0

su nombre indica se trata de un objeto individual con una propiedad Name, que es una matriz.

Calculo inicializar una matriz vacía PS:

$DBNameList = (Invoke-SQLCmd -query "select Name from sysdatabases" -Server DEVSQLSRV) 
[Array]$DbNames = @() 
$DBNameList.Name | ForEach-Object {$DbNames += $_} 
$DbNames -contains "DBTwo" 

Ha habido suerte?

3

Lo que falta en la publicación original es algún tipo de conversión, de un objeto a una matriz.

Powershell genera el resultado de $ DBNameList porque interpreta un poco el objeto. Pero si usted necesita para manipular este objeto e identificar un elemento específico de ella, este es el método que utilizo:

$Itm = "DBTwo" 
$DBNameList = @(Invoke-SQLCmd -query "select Name from sysdatabases" -Server DEVSQLSRV) 
$NameList = @($DBNameList | select-object -ExpandProperty Name) 
$Name = ($NameList.Split()).Contains($Itm) 
Write-Output $Name 

verdadera

He estado buscando esto por mí mismo por un tiempo y finalmente funcionó, ¡así que espero que ayude a alguien más!

-1

Todavía muy nuevo en Powershell (menos de dos semanas): sugiero que intente esto, si su consulta contiene múltiples columnas y filas ... Matrices multidimensionales. Este fue mi primer intento de esto, y después de consultar la web, dado que no pude encontrar una solución sencilla y directa, terminé escribiendo mi propia solución. Aquí está el conjunto completo de código de muestra para que experimentes y uses.


Sistema completo de código de ejemplo siguiente ....

############################################################################################# 
    # RDSago 
    # [email protected] 
    # 09/20/2014 
    ############################################################################################# 
    # 
    # Capturing database size information from a collection of servers 
    # and returning that back to an array that can be used to populate 
    # a SQL table that can be used for monitoring database growth remotely. 
    # RDSago, [email protected] 
    # 
    # Note, SQL data retrieved in this manner, does not have to be parsed 
    # before it is consumed and used elsewhere, just like any array you have defined. 
    # The data only needs to be addressed by its ".identityname" captured in the 
    # array $queryResults (shown below). 
    # 
    ############################################################################################ 

    ############################################################################################# 
    # T-SQL for creating table to hold data returned 
    # 
    # CREATE TABLE [dba].[tbl_dbfilesize](
    # [ServerNameInstance] [varchar](20) NULL, 
    # [DatabaseName] [varchar](30) NULL, 
    # [DataFileSizeMB] [numeric](20, 0) NULL, 
    # [LogFileSizeMB] [numeric](20, 0) NULL, 
    # [TotalDatabaseSizeMB] [numeric](20, 0) NULL, 
    # [CollectionDate] [date] NULL 
    # ) ON [PRIMARY] 
    ############################################################################################# 




    Try 
    { 

    #define your connection points 

     # first create an array that will hold the server/instance name of the servers you wish to audit 
     # the first sever assumes a named instance, the second a default instance name. 
     $SourceServerName = @("ServerName01/InstanceName", "ServerName02", "ServerName03") # Server you will retrieve data from 

     #next define the server connection for where you will write your data back to 
     $TargetServerInstance = "TaretServerName" 

    # define your sql query that will be used to pull data from SQL on the Source Server 
     $qryDatabaseInfo = " 
     SELECT @@ServerName as ServerNameInstance, 
     DB.name as DatabaseName, 
     SUM(CASE WHEN type = 0 THEN MF.size * 8/1024 ELSE 0 END) AS DataFileSizeMB, 
     SUM(CASE WHEN type = 1 THEN MF.size * 8/1024 ELSE 0 END) AS LogFileSizeMB, 
     SUM(CASE WHEN type = 1 THEN MF.size * 8/1024 ELSE 0 END) + SUM(CASE WHEN type = 0 THEN MF.size * 8/1024 ELSE 0 END) AS TotalDatabaseSizeMB 
     FROM sys.master_files MF 
     JOIN sys.databases DB ON DB.database_id = MF.database_id 
     GROUP BY DB.name 
     ORDER BY DB.NAME ASC 
     " 

     #Loop through all the servers you wish to audit 
     ForEach ($SourceServerName in $SourceServerNames) 

      { 

      #execute query to pull data from server into an array 
      $queryResults = @(Invoke-SQLCmd -query $qryDatabaseInfo -Server $SourceServerInstance) 

      # Next, construct your insert statement from data in your $queryresults array. 

      Foreach ($queryResult in $queryResults) 
       { 

        $query = " 
        Insert Into [DBS_AUDIT_SERVERS].[dba].[tbl_dbfilesize] 
        ([ServerNameInstance], 
        [DatabaseName], 
        [DataFileSizeMB], 
        [LogFileSizeMB], 
        [TotalDatabaseSizeMB], 
        [CollectionDate]) 
        Values 
         (" + 
         "'" + $SourceServerInstance + "'," + 
         "'" + $queryResult.DatabaseName + "'," + 
         "'" + $queryResult.DataFileSizeMB + "'," + 
         "'" + $queryResult.LogFileSizeMB + "'," + 
         "'" + $queryResult.TotalDatabaseSizeMB + "'," + 
         "'" + $Date + "'" + 
         ")" 
         "" 
        #execute insert statement for sql 
        Invoke-Sqlcmd -Query $query -ServerInstance $TargetServerInstance 
       }  
      } 
    } 

    Catch [Exception] 
     { 
      $ErrorMessage = $_.Exception.Message 
      Write-Host $ErrorMessage 
     } 


    Finally 
     { 
      Write-Host "Completed Successfully" 
     } 
    Return 0; 
0

Su código ...

$DBNameList = (Invoke-SQLCmd -query "select Name from sysdatabases" -Server DEVSQLSRV) 

... te da la espalda .. DataRows

Esto se puede comprobar con

$DBNameList | Get-Member 

También puede ver que hay un ingenio propiedad el nombre de "Nombre".

Si desea comprobar si una de las datarows en su $ DBNameList contiene el nombre de 'DBTwo' que tendría que escribir lo siguiente:

$DBNameList.Name -contains 'DBTwo' 
Cuestiones relacionadas