用于 Configuration Manager 报表的 SQL 语句参考

创建 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 (*) 聚合函数的示例,该查询来自每个站点预定义报表) 和示例结果集 的计数 客户端。

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

JOINS

若要在 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 子句用于补充数据,而不是筛选数据。 三种类型的外部联接 (左、右和完整) 指示主数据的源。 当视图中具有 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) phrase

带有关键字 (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

另请参阅

使用查询设计器为 Configuration Manager 报表编写报表 SQL 语句