创建 Configuration Manager 报表时可以使用许多有用的Microsoft SQL Server语句,本节将简要介绍这些语句。 若要遵循此讨论,应具备基本的 SQL 查询语句知识以及编写查询的能力,如下所示:
SELECT Name, Comment, CollectionID
FROM v_Collection
WHERE Name LIKE 'All Windows%'
ORDER BY Name
有关如何编写基本查询的信息,请参阅SQL Server文档。
聚合函数
SUM、AVG、COUNT、COUNT (*) 、MAX 和 MIN 等聚合函数 () 查询结果集中生成摘要值。 聚合函数 (除 COUNT (*) ) 处理单个列中的所有选定值以生成单个结果值。 聚合函数可应用于视图中的所有行、WHERE 子句指定的视图子集或视图中的一组或多组行。 应用聚合函数时,会从每组行生成一个值。
重要
请注意,聚合结果中不包含 NULL 值。 例如,如果有 100 条记录,其中 8 条记录具有要计数的属性的 NULL 列值,则计数将仅返回 92 个结果。
以下查询 (显示了使用 COUNT (*) 聚合函数的示例,该查询来自每个站点预定义报表的 Count 客户端) 和示例结果集。
SELECT v_Site.SiteCode, v_Site.SiteName, v_Site.ReportingSiteCode,
Count(SMS_Installed_Sites0) AS 'Count'
FROM v_Site, v_RA_System_SMSInstalledSites InsSite
WHERE v_Site.SiteCode = InsSite.SMS_Installed_Sites0
GROUP BY SiteCode, SiteName, ReportingSiteCode
ORDER BY SiteCode
| SiteCode | SiteName | ReportingSiteCode | 记数 |
|---|---|---|---|
| ABC | ABC 网站 | 928 | |
| 123 | 123 站点 | ABC | 1010 |
日期和时间函数
许多内置报表使用日期和时间函数。 最常用的函数是 GETDATE、DATEADD、DATEDIFF 和 DATEPART。
GETDATE ()
GETDATE 函数以SQL Server日期/时间值的内部格式生成当前日期和时间。 GETDATE 将 NULL 参数 () 。
以下示例生成当前系统日期和时间:
SELECT GETDATE()
| (没有列名) |
|---|
| 2005-05-29 10:10:03.001 |
DATEADD (datepart、number、date)
DATEADD 函数根据向指定日期添加间隔返回新的 日期时间 值。
Datepart 是一个参数,它指定要在日期的哪个部分返回新值 (例如,年、月、日、小时、分钟等 ) ,number 是用于递增 datepart 的值, date 是开始日期。
以下示例生成自 2005 年 5 月 29 日起两天的日期:
SELECT DATEADD([day], 2, '2005-05-29 10:10:03.001')
| (没有列名) |
|---|
| 2005-05-31 10:10:03.001 |
DATEDIFF (datepart 、startdate 、enddate)
DATEDIFF 函数返回两个指定日期之间跨越的日期和时间边界的数目。
Datepart 是一个参数,它指定要在日期的哪个部分返回新值 (例如,年、月、日、小时、分钟等 ) ,startdate 是开始日期, enddate 是结束日期。
以下示例生成第一个和第二个日期之间的分钟数:
SELECT DATEDIFF (minute, '2005-05-29 10:10:03.001',
'2005-06-12 09:28:11.111')
| (没有列名) |
|---|
| 20118 |
DATEPART (datepart 、date)
DATEPART 函数返回一个整数,表示指定日期的指定 日期部分 。
Datepart 是指定要返回日期的哪一部分的参数, 而 date 是指定的日期。
以下示例在指定日期中生成月份:
SELECT DATEPART (month, '2005-05-29 10:10:03.001')
| (没有列名) |
|---|
| 5 |
合并日期和时间函数
通常,在Configuration Manager报表中使用日期和时间函数的组合。
以下示例导致当前日期和时间 (2005-05-29 10:10:03.001 在此示例中) 减去 100 天:
SELECT DATEADD([day], - 100, GETDATE())
| (没有列名) |
|---|
| 2005-02-18 10:10:03.001 |
使用日期和时间函数的示例查询
以下查询将生成一天期间的状态消息总数。 在此查询中,将使用 COUNT、GETDATE 和 DATEADD 函数以及 BETWEEN 逻辑运算符以及 GROUP BY 和 ORDER BY 子句。
SELECT SiteCode, MessageID, COUNT(MessageID) AS [count],
GETDATE() AS [End Date]
FROM vStatusMessages
WHERE ([Time] BETWEEN DATEADD([day], -1, GETDATE()) AND GETDATE())
AND (MessageID BETWEEN '0' AND '10000')
GROUP BY SiteCode, MessageID
ORDER BY SiteCode, MessageID
| 网站代码 | MessageID | 记数 | End Date |
|---|---|---|---|
| ABC | 500 | 190 | 2005-05-29 10:10:03.001 |
| ABC | 501 | 130 | 2005-05-29 10:10:03.001 |
| ABC | 502 | 190 | 2005-05-29 10:10:03.001 |
| ABC | 1105 | 85 | 2005-05-29 10:10:03.001 |
| ABC | 1106 | 5 | 2005-05-29 10:10:03.001 |
加入
若要在 Configuration Manager 中创建有效的报表,需要了解如何联接不同的视图以获取预期数据。 有三种类型的联接:内部联接、外部联接和交叉联接。 此外,还有三种类型的外部联接:左联接、右联接和完整联接。 自联接利用上述任何联接,但联接同一视图中的记录。
内部联接
在内部联接中,仅当联接字段的值满足某些指定条件时,两个视图中的记录才会合并并添加到查询的结果中。 如果使用 ResourceID 使用内部联接来联接 v_R_System 和 v_GS_WORKSTATION_STATUS 视图,则结果将是所有系统及其上次硬件扫描日期的列表。
SELECT v_R_System.Netbios_Name0 AS MachineName,
v_GS_WORKSTATION_STATUS.LastHWScan AS [Last HW Scan]
FROM v_R_System INNER JOIN v_GS_WORKSTATION_STATUS
ON v_R_System.ResourceID = v_GS_WORKSTATION_STATUS.ResourceID
| 计算机名称 | 上次 HW 扫描 |
|---|---|
| Client1 | 2005-05-29 10:10:03.001 |
| Client3 | 2005-06-12 09:28:11.110 |
外部联接
外部联接返回联接视图中的所有行,无论它们之间是否有匹配的行。 ON 子句补充数据,而不是筛选数据。 左、右和全 (三种类型的外部联接) 指示main数据源。 当视图中有 NULL 值时,外部联接尤其有用。
左外部联接
使用左外部联接合并两个视图时,结果中包括左侧视图中的所有行。 在以下查询中,使用左侧外部联接联接 v_R_System 视图和 v_GS_WORKSTATION_STATUS 视图。 v_R_System视图是查询中列出的第一个视图,使其成为左侧视图。 结果将包括所有系统及其上次硬件扫描日期的列表。 与内部联接不同,尚未扫描硬件的系统仍将以 NULL 值 (列出,如结果集中) 所示。
SELECT v_R_System.Netbios_Name0 AS MachineName,
v_GS_WORKSTATION_STATUS.LastHWScan AS [Last HW Scan]
FROM v_R_System LEFT OUTER JOIN v_GS_WORKSTATION_STATUS
ON v_R_System.ResourceID = v_GS_WORKSTATION_STATUS.ResourceID
| 计算机名称 | 上次 HW 扫描 |
|---|---|
| Client1 | 2005-05-29 10:10:03.001 |
| Client2 | NULL |
| Client3 | 2005-06-12 09:28:11.110 |
右外部联接
右外部联接在概念上与左外部联接相同,只不过右视图中的所有行都包含在结果中。
完全外部联接
完整外部联接从两个联接的视图中检索所有行。 它返回联接条件为 true 的所有配对行,以及每个视图中与另一个视图中的 NULL 行串联的未配对行。 通常不希望使用此类型的外部联接。
交叉联接
交叉联接返回两个视图的乘积,而不是总和。 左侧视图中的每一行都与右视图中的每一行匹配。 它是所有可能的行组合的集合,无需任何筛选。 但是,如果添加 WHERE 子句,交叉联接将用作内部联接,它将使用 条件将所有可能的行组合向下筛选为所需的行组合。
自加入
自联接使用上述任一联接类型,但是一个与自身联接的视图。 在数据库关系图中,自联接称为自反关系。
NOT IN 关键字 (keyword) 短语
具有关键字 (keyword) 短语 NOT IN 的子查询对于查找不满足特定条件的数据集的信息非常有用。 在以下示例中,查询返回未安装 Notepad.exe 的所有计算机的 NetBIOS 名称。 必须首先创建一个查询,该查询可以检测安装了所选文件的所有计算机,如下所示:
SELECT DISTINCT v_R_System.Netbios_Name0
FROM v_R_System INNER JOIN v_GS_SoftwareFile
ON (v_GS_SoftwareFile.ResourceID = v_R_System.ResourceId)
WHERE v_GS_SoftwareFile.FileName = 'Notepad.exe'
确认第一个查询显示已安装 Notepad.exe 的所有计算机后,以下子查询语句将使用 NOT IN 关键字 (keyword) 短语查找未安装 Notepad.exe 文件的所有计算机名称:
SELECT DISTINCT Netbios_Name0
FROM v_R_System
WHERE Netbios_Name0 NOT IN
(SELECT DISTINCT v_R_System.Netbios_Name0
FROM v_R_System INNER JOIN v_GS_SoftwareFile
ON (v_GS_SoftwareFile.ResourceID = v_R_System.ResourceId)
WHERE v_GS_SoftwareFile.FileName = 'Notepad.exe')
ORDER by Netbios_Name0