Sql

SCCM 對收集成員計數的報告正在返回垃圾

  • September 6, 2018

我已經寫了一份報告,一次給我多個集合的總成員數。它執行,但當它執行時,只有列表中的第一個集合返回其實際成員資格。其他人返回垃圾數據。這是伺服器 2008R2 VM 上的 SCCM 1610 環境。我正在 SQL Server Report Builder 3.0 中建構報表。我的測試是在查詢設計器中執行執行命令,然後將結果與配置管理器控制台中該集合的成員資訊進行比較。為了更全面地解釋我的問題,這裡是一個集合的程式碼:

SELECT
   v_Collection.Name,
   v_Collection.Comment,
   v_Collection.CollectionID,
   COUNT(*) AS [Members]

FROM
   v_Collection,
   v_FullCollectionMembership

WHERE
   v_Collection.CollectionID = v_FullCollectionMembership.CollectionID
   AND v_Collection.CollectionID LIKE 'XXXXXX01'

GROUP BY
   v_Collection.Name,
   v_Collection.Comment,
   v_Collection.CollectionID

ORDER BY
   v_Collection.Name

上面的程式碼將返回:

一次採集結果

如果我添加一個 OR 語句和另一個這樣的集合:

SELECT
   v_Collection.Name,
   v_Collection.Comment,
   v_Collection.CollectionID,
   COUNT(*) AS [Members]

FROM
   v_Collection,
   v_FullCollectionMembership

WHERE
   v_Collection.CollectionID = v_FullCollectionMembership.CollectionID
   AND v_Collection.CollectionID LIKE 'XXXXXX01'
   OR v_Collection.CollectionID LIKE 'XXXXXX02'

GROUP BY
   v_Collection.Name,
   v_Collection.Comment,
   v_Collection.CollectionID

ORDER BY
   v_Collection.Name

這是結果:

二次採集結果

CollectionID XXXXXX02 沒有超過 900,000 個成員。它有不到 200 個。查看 ConfigMgr 中的集合就可以看出這一點,我有理由相信我們在這個集合中沒有一百萬個流氓設備。

這對我來說最令人困惑的部分是當我添加連續的集合時,第一個之後的每個集合都有相同的數字,並且列表中的集合越多,它就越大。所以舉個例子,沒有更多的截圖,如果我添加第三個集合,結果如下:

CollID   - MemberCount
XXXXXX01 - 1944
XXXXXX02 - 940519
XXXXXX03 - 940519

如果我添加第四個集合,結果如下:

CollID   - MemberCount
XXXXXX01 - 1944
XXXXXX02 - 940568
XXXXXX03 - 940568
XXXXXX04 - 940568

我想指出,這些數字每次都不會隨著收集次數的增加而增加。三個集合的壞數和四個集合的壞數之間的差異是 49,但第四個集合有幾千個成員。

我敢肯定這是因為我對 SQL 和/或一般編碼都一無所知,但即使在經驗豐富的系統管理員團隊中,我也是僅有的幾個會在沒有大量經驗的情況下嘗試編寫這樣的東西的人之一,在我們的團隊中沒有人有大量的 SQL 或查詢經驗,所以我是事實上的SCCM 報告專家。大多數時候,我可以從現有報告和網際網路中蠶食程式碼,但這讓我很難過。感謝您花時間審查我的問題。

您是否嘗試過僅使用 v_Collection 中的 MemberCount 欄位而不是您的 COUNT(*)?這樣你就不需要“Group By”子句,它應該更容易調試。

查看下面的連結以下載 SQL 視圖的完整列表,這將有助於稍後建構查詢。

https://gallery.technet.microsoft.com/SCCM-Configmgr-2012-R2-SQL-5fefdd3b

乾杯

我更新了您的查詢,以便它可以正常工作。

SELECT
   Coll.Name as 'Collection Name',
   Coll.Comment as 'Comment',
   Coll.CollectionID as 'Collection ID',
   COUNT(*) AS 'Members'
FROM
   dbo.v_Collection Coll
   join dbo.v_FullCollectionMembership FCM on Coll.CollectionID = FCM.CollectionID
WHERE
   Coll.CollectionID LIKE 'XXXXXX01'
   OR Coll.CollectionID LIKE 'XXXXXX02'
GROUP BY
   Coll.Name,
   Coll.Comment,
   Coll.CollectionID
ORDER BY
   Coll.Name

引用自:https://serverfault.com/questions/890564