試圖理解這段代碼。
我知道正在創建一個哈希表。
然后運行一個我省略的 sql 查詢,但它通過管道傳輸到 foreach。下一行是我沒有得到正在發生的事情的地方。employee_number 來自 sql 查詢,但 $empExtraDepts[$_.employee_number] 不會是 $null,因為它只是在代碼的第 1 行中創建的。我什至無法很好地解釋這一點。
$empExtraDepts = @{}
Invoke-Sqlcmd -Query "SQL Query" | foreach {
if($empExtraDepts[$_.employee_number] -eq $null) {
$empExtraDepts[$_.employee_number] = @()
}
$empExtraDepts[$_.employee_number] = $_.a_segment_5.Trim() }
uj5u.com熱心網友回復:
代碼的作用:
- 它創建一個哈希表,其:
- 輸入鍵是從 SQL 查詢回傳的不同員工編號(
.employee_number值)。 - 條目值包含從查詢回傳的所有行中給定員工(數字)的所有值的陣列。
.a_segment_5
- 輸入鍵是從 SQL 查詢回傳的不同員工編號(
它是如何做到的:
if ($empExtraDepts[$_.employee_number] -eq $null)檢查哈希表是否已經包含手頭員工編號的條目(請參閱下文了解如何改進此測驗)。如果不是,它(隱式地)為該員工編號創建一個條目,其中一個空陣列作為值:
$empExtraDepts[$_.employee_number] = @()- 請注意,使用索引語法 ( )分配
[$key]給哈希表條目會隱式創建帶有鍵的條目($key如果它尚不存在)。如果它已經存在,則替換現有條目的值。
- 請注意,使用索引語法 ( )分配
因此,該陳述句后面的
if陳述句可以依賴于$empExtraDepts[$_.employee_number]包含一個(最初為空的)陣列,并向$empExtraDepts[$_.employee_number] = $_.a_segment_5.Trim()其附加一個新元素,松散地說,即.a_segment_5手頭行的修剪值。(請參閱下文,了解如何提高效率。)
可以通過兩種方式改進代碼:
一般來說,最好放在/比較
$null的 LHS上,因為如果比較值是一個陣列(如本例),在 RHS 上使用它會產生意想不到的結果,因為/ (和其他比較運算子)起作用作為具有陣列值 LHS 的過濾器,即回傳匹配元素的子陣列- 參見about_Comparison_Operators。-eq-ne-eq-ne嚴格來說,測驗一個條目
$null與測驗它是否存在不同(盡管在你的情況下這不會有所作為);對于后者,使用以下.Contains()方法:if ($empExtraDepts.Contains($_.employee_number]))
“增長”陣列
=效率低下,因為每次都必須在后臺分配一個新陣列,因為 .NET 陣列是固定大小的資料結構。- 因此,最好使用可有效擴展的類陣列資料結構,例如
[System.Collections.Generic.List[object]].
- 因此,最好使用可有效擴展的類陣列資料結構,例如
所以:
# Initialize the results hashtable.
$empExtraDepts = @{}
# Execute the query and process each row returned.
Invoke-Sqlcmd -Query "SQL Query" | ForEach-Object {
# Does the hashtable already have an entry for the employee number at hand?
if ($null -eq $empExtraDepts[$_.employee_number]) { # Note the $null on the LHS
# No -> create the entry with an (initially) empty list as the value.
$empExtraDepts[$_.employee_number] = [System.Collections.Generic.List[string]] @()
}
# Add the trimmed .a_segment_5 value of the row at hand
# to the list stored in the entry for the employee number at hand.
# Note the use of the .Add() method.
$empExtraDepts[$_.employee_number].Add($_.a_segment_5.Trim())
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517917.html
標籤:sql电源外壳
