2010-10-26 20 views
6

में ऐरे के रूप में SQL क्वेरी लौटाएं मेरे पास सर्वर DEVSQLSRV पर डेटाबेस "DBOne", "DBTwo", "DBTree" डेटाबेस के साथ एक SQL 2008 एंट सर्वर है।पावरहेल

यहाँ मेरी PowerShell स्क्रिप्ट है:

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

इस रूप में डेटाबेस नामों में से मेरी वांछित सूची का उत्पादन:

Name 
----- 
DBOne 
DBTwo 
DBThree 

मैं कर दिया गया है मेरी धारणा कुछ भी है कि एक सूची के रूप दिया जाता है किसी सरणी है कि पावरहेल में "गलत" के बजाय "सही" जो मुझे नेतृत्व कर रहा है विश्वास है कि मेरी सूची में एक वास्तविक सरणी नहीं है

$DBNameList -contains 'DBTwo' 

यह वापस आता है: हालांकि, जब मैं तो इस PowerShell में प्रयास करें।

कोई विचार जो मैं यहां याद कर रहा हूं?

बहुत बहुत धन्यवाद!

Emo

उत्तर

9

मैं यह कर चाहते हैं:

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

है कि आप names.The विकल्प -contains की एक सरणी ठीक काम करना चाहिए दे देंगे।

0

नाम हैडर यह एक नाम संपत्ति जो एक सरणी है के साथ एक वस्तु है पता चलता है।

मैं एक खाली पुनश्च सरणी प्रारंभ मानना:

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

किसी भी भाग्य?

3

मूल पोस्ट से क्या गुम है किसी ऑब्जेक्ट से किसी ऑब्जेक्ट में कुछ प्रकार का रूपांतरण है।

पावरहेल $ 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 

सच

मैं थोड़ी देर के लिए इस बात के लिए अपने आप को देख रही है और किया गया है आखिरकार इसे काम किया, इसलिए मुझे आशा है कि यह किसी और की मदद करेगी!

-1

अभी भी पावरहेल (दो सप्ताह से भी कम) के लिए बहुत नया है: मेरा सुझाव है कि यदि आप अपनी क्वेरी में एकाधिक कॉलम और पंक्तियां हैं ... बहु-आयामी Arrays। यह मेरा पहला प्रयास था, और वेब की जांच करने के बाद, मुझे एक सरल सीधा समाधान समाधान नहीं मिला, मैंने अपना खुद का समाधान लिखना समाप्त कर दिया। प्रयोग और प्रयोग करने के लिए यहां नमूना कोड का पूरा सेट है।


नीचे नमूना कोड का पूरा सेट ....

############################################################################################# 
    # 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

आपका कोड ...

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

... तुम वापस Datarows देता है ..

आप

$DBNameList | Get-Member 

आप यह भी देख सकते हैं एक संपत्ति बुद्धि नाम "नाम" है कि वहाँ के साथ इस जाँच कर सकते हैं।

आप की जाँच करने के लिए यदि आपके $ DBNameList में datarows में से एक 'DBTwo' का नाम शामिल करना चाहते हैं तो आपको निम्न इसे लिखने की आवश्यकता होगी:

$DBNameList.Name -contains 'DBTwo'