2016-09-20 55 views
0

我有,我認爲,它是一個真正的頭部劃痕。使用Powershell解析SQL數據時遇到問題

我正在訪問數據庫以獲取帳戶列表。每個帳戶都有一個account_id和account_parent_id屬性(在其他幾個屬性中)。如果該帳戶是另一個帳戶的子帳戶,則account_parent_id具有父級的帳戶ID,如果該帳戶是父級(或沒有子級),則account_parent_id爲空。只有兩個級別,所以如果一個帳戶有一個或多個孩子,它不會有父母。

我需要的輸出是帳戶號碼(如果該帳戶沒有子女)以及父母和所有子女(逗號分隔)的帳戶號碼,如果有子女。這裏是我的代碼:

$SQLServer = "<database fqdn>" 
$SQLDBName = "<databaes name>" 
$uid ="<username>" 
$pwd = "<password>" 
$SqlQuery = "SELECT * from <account table>" 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Persist Security Info = True; User ID = $uid; Password = $pwd;" 
$SqlConnection.Open() 

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 

$data = $DataSet[0].Tables 

$SqlConnection.Close() 

Foreach ($row in $data) { 
    Foreach ($account in $row) { 
     If ($account.parent_account_id -eq $row.account_id) { 
      $accts += $account.account_id 
     } 
     ElseIf ($account.parent_account_id -eq $account.account_id) { 
      $accts = $account.account_id 
     } 
     Return $accts 
    } 
} 

的問題是,我沒有得到任何東西到$ accts。我在這裏錯過了什麼?

謝謝。

+0

你的命名有些奇怪。 '$ data = $ DataSet [0] .Tables'要麼是表格,要麼是多個表格。然後執行'Foreach($ data in $ data)' - 是表集合中的這些表,還是表中的行?如果他們是行,你爲什麼要做'Foreach($行中的$賬戶){'?無論哪種方式,你如何期待'$ account'和'$ row'都*具有帳戶的屬性?你爲什麼在函數外使用'Return'?並且在嵌套循環的內部循環中使用'return' - 將立即退出。你永遠不會初始化'$ accts'。 – TessellatingHeckler

+0

您可以直接在SQL中使用類似'select account_id as id,(從account where account_parent_id = id選擇group_concat(account_id)')作爲子帳號 ,其中account_parent_id爲null;' - http://www.sqlfiddle .com /#!9/e02abc/1 – TessellatingHeckler

+0

根據你的查詢'$ data'應該包含一個表。當你輸出'$ data |時你會得到什麼? Format-Table -AutoSize'?另外,我不認爲'foreach'循環正在做你認爲他們做的事。請顯示您的表格結構並解釋您想要匹配哪些值與哪些其他值。 –

回答

0

所以,我們確實最終更新了SQL查詢。我回來的數據類型是一個DataTable。我拿出一排,並使用如下循環,以獲得他需要的數據:

foreach ($item in $tableRow) { 
    $($item.account_ids) 
} 
0

,以達到您想要的效果,最好的辦法是做映射SQL:通過Group-Objectcalculated properties

$SqlQuery = @' 
SELECT t1.account_id AS parent, t2.account_id AS child 
FROM <account table> t1 LEFT OUTER JOIN <account table> t2 
    ON t1.account_id = t2.parent_account_id 
'@ 

然後你就可以提取您想要的信息:

$data | Group-Object parent | 
    Select-Object @{n='Parent';e={$_.Name}}, 
        @{n='Children';e={$_.Group.child -join ','}} 

如果」再次遇到PowerShell v2或更早版本,您需要用($_.Group | Select-Object -Expand child) -join ','之類的東西替換$_.Group.child -join ','

+0

與該SQL查詢,我只得到表中的一行。 「父」列爲空白,並且「兒童」列中有一堆帳戶名稱。 – StackExchangeGuy

+0

對不起,應該是't2.account_id',而不是't2.account_name'。爲獲得進一步的幫助,您需要顯示樣本數據。 –

相關問題