Возврат SQL-запроса как массива в Powershell - PullRequest
8 голосов
/ 27 октября 2010

У меня есть сервер SQL 2008 Ent с базами данных «DBOne», «DBTwo», «DBThree» на сервере DEVSQLSRV.

Вот мой скрипт Powershell:

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

В результате получается мой желаемый список имен баз данных:

Name
-----
DBOne
DBTwo
DBThree

Я исходил из того, что все, что возвращается в виде списка, является массивом в Powershell.Тем не менее, когда я пытаюсь сделать это в Powershell:

$DBNameList -contains 'DBTwo'

Возвращается «False» вместо «True», что наводит меня на мысль, что мой список не является действительным массивом.

Есть идеи, что мне здесь не хватает?

Большое спасибо!

Эмо

Ответы [ 5 ]

10 голосов
/ 31 марта 2011

Я бы сделал это:

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

Это даст вам массив имен. Опция -contains должна работать нормально.

3 голосов
/ 19 августа 2014

В оригинальном сообщении отсутствует какой-то тип преобразования из объекта в массив.

Powershell выводит результат $ DBNameList, потому что он как бы интерпретирует объект.Но если вам нужно манипулировать этим объектом и идентифицировать из него определенный элемент, я использую этот метод:

$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

True

Я искалэто я сам какое-то время и наконец решил, так что я надеюсь, что это поможет кому-то еще!

0 голосов
/ 12 апреля 2017

Ваш код ...

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

... возвращает вам Датарус ..

Вы можете проверить это с помощью

$DBNameList | Get-Member

Вы также можете видеть, что есть свойство с именем «Имя».

Если вы хотите проверить, содержит ли одна из датаров в вашем $ DBNameList имя «DBTwo», вам нужно написать следующее:

$DBNameList.Name -contains 'DBTwo'
0 голосов
/ 20 сентября 2014

Все еще очень плохо знаком с Powershell (менее двух недель): я советую вам попробовать это, если ваш запрос содержит несколько столбцов и строк ... Многомерные массивы. Это была моя первая попытка, и после проверки сети, поскольку я не смог найти простое прямое решение, я в итоге написал свое собственное решение. Вот полный набор примеров кода, с которым вы можете поэкспериментировать и использовать.


Полный набор примеров кода ниже ....

    #############################################################################################
    # RDSago
    #  RDSago@gmail.com
    #  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, RDSago@gmail.com
    #
    #  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 голосов
/ 09 ноября 2010

Заголовок Name предполагает, что это отдельный объект со свойством Name, представляющим собой массив.

Я считаю инициализировать пустой массив PS:

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

Удачи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...