AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 535281
Accepted
The_Ratzenator
The_Ratzenator
Asked: 2013-08-31 17:24:33 +0800 CST2013-08-31 17:24:33 +0800 CST 2013-08-31 17:24:33 +0800 CST

运行我的 SQL 代码时不断出错

  • 772

我不断收到可怕的“在预期条件的上下文中指定的非布尔类型的表达式”。在“From”语句部分的下面代码中的粗体“ dbo.v_R_System.ResourceID ”处出现错误。而且我还收到“关键字'WHERE'附近的语法不正确。”错误消息。

在我的这个查询中,错误在哪里?

SELECT DISTINCT
    dbo.v_GS_COMPUTER_SYSTEM.Name0 AS [Computer Name],
                       [Top Console User] = CASE 
                             WHEN (dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 is NULL or dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 = '-1') 
                             THEN 'Unknown' 
                             ELSE dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 
                             END, 
                        dbo.v_R_System.AD_Site_Name0 AS [Active Directory Site Name],
                        dbo.v_R_System.Resource_Domain_OR_Workgr0 AS [Domain Name], 
                        dbo.v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System], 
                        dbo.v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack],
                        dbo.v_GS_COMPUTER_SYSTEM.Model0 AS [Computer Model], 
                        dbo.v_GS_OPERATING_SYSTEM.InstallDate0 AS [OS Install Date]

 FROM         
    dbo.v_GS_COMPUTER_SYSTEM INNER JOIN
                       dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP ON dbo.v_GS_COMPUTER_SYSTEM.ResourceID = dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.ResourceID INNER JOIN 
                       dbo.v_GS_OPERATING_SYSTEM INNER JOIN
                       dbo.v_R_System ON dbo.v_GS_OPERATING_SYSTEM.ResourceID = **dbo.v_R_System.ResourceID**

 WHERE
    dbo.v_GS_OPERATING_SYSTEM.Caption0 NOT LIKE '%Server%'

 GROUP BY
    dbo.v_GS_COMPUTER_SYSTEM.Name0, 
                       dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0,
                       dbo.v_R_System.AD_Site_Name0, 
                       dbo.v_R_System.Resource_Domain_OR_Workgr0, 
                       dbo.v_GS_OPERATING_SYSTEM.CSDVersion0, 
                       dbo.v_GS_PC_BIOS.Manufacturer0, 
                       dbo.v_GS_COMPUTER_SYSTEM.NumberOfProcessors0,
                       dbo.v_GS_OPERATING_SYSTEM.Caption0, 
                       dbo.v_GS_COMPUTER_SYSTEM.Model0,
                       dbo.v_GS_OPERATING_SYSTEM.InstallDate0
sql
  • 2 2 个回答
  • 567 Views

2 个回答

  • Voted
  1. Falcon Momot
    2013-08-31T18:31:50+08:002013-08-31T18:31:50+08:00

    最有可能的是,您遇到了优先级问题,并且您的 from 子句没有按照您的想法进行评估。

    尝试添加括号,如下所示:

    FROM
        ((dbo.v_GS_COMPUTER_SYSTEM
          INNER JOIN dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP
             ON (dbo.v_GS_COMPUTER_SYSTEM.ResourceID =
                 dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.ResourceID)
         )
        INNER JOIN dbo.v_GS_OPERATING_SYSTEM
        )
        INNER JOIN dbo.v_R_System ON (dbo.v_GS_OPERATING_SYSTEM.ResourceID =
                                      dbo.v_R_System.ResourceID)
    

    如果这不是您真正想要的,您就会看到问题所在。

    请注意,虽然这不是绝对必要的,并且可能由查询执行计划程序处理,但如果您在开始之前使用子查询处理 WHERE 子句中的条件,则可以创建较小的临时表做连接。

    我也不完全确定您的 CASE 语法是否正确。我相信应该是

    CASE WHEN
        (dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 is NULL
         or dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 = '-1')
      THEN 'Unknown'
      ELSE dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0
    END AS [Top Console User]
    

    但是,众所周知,我是错的。我期望的错误将是“未知字段[顶级控制台用户]”的影响。

    • 2
  2. Best Answer
    The_Ratzenator
    2013-09-06T11:35:48+08:002013-09-06T11:35:48+08:00

    SCCM 报告名称:工作站上的顶级控制台用户/一般计算机信息

    解释:

    这就是我为修复上面错误的初始代码所做的工作,因此我能够提取有关顶级控制台用户的信息以及一些通用计算机信息,如制造商和型号。顺便说一句,顶级控制台用户利用 SCCM 资产智能(启用时)并要求在您的环境中也启用“审核帐户登录事件”策略,这可以通过 GPO 完成。您可以在Microsoft TechNet上阅读有关启用此策略的更多信息。此外,我遇到了此报告未显示所有 NULL 值的问题,但后来我使用了我的连接并意识到我需要一个左连接和两个右连接,以便我的所有数据显示在我的环境中的所有工作站上. 因此,下面的报告将做两件事:

    • 如果正在审核安全日志是否成功登录(再次可以通过已经提到的 GPO 完成)或每个系统手动审核,它将显示哪些系统具有最高控制台用户

    和

    • 它还将向您显示所有 NULL 值(在本例中为“未启用审核帐户登录事件”,因为这是我告诉报告替换 NULL 值的内容),这显然会告诉您哪些系统没有安全日志被审计。

    笔记:

    某些系统可能会报告“顶级控制台用户”,即使您没有通过 GPO 启用“审核帐户登录事件”,仅当出于某种原因手动配置安全日志以由某人在该特定系统上审核时,例如超级用户或本地管理员等。因此,如果您看到某些系统会报告此信息,但大多数系统不会报告此信息,请不要惊慌,因为这很可能是原因。

    SQL 代码:

    选择不同

    dbo.v_GS_COMPUTER_SYSTEM.Name0 AS [Computer Name],
                       [Top Console User] = CASE WHEN 
                            (dbo.v_GS_SYSTEM_CONSOLE_USAGE.TopConsoleUser0) is NULL  
                             THEN 'Audit Account Logon Events Not Enabled' 
                             ELSE dbo.v_GS_SYSTEM_CONSOLE_USAGE.TopConsoleUser0 
                             END, 
                        dbo.v_R_System.Resource_Domain_OR_Workgr0 AS [Domain Name], 
                        dbo.v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System], 
                        dbo.v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack],
                        dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0 AS [Computer Manufacturer],
                        dbo.v_GS_COMPUTER_SYSTEM.Model0 AS [Computer Model] 
    

    从

    dbo.v_R_System 
    Left Join
    dbo.v_GS_SYSTEM_CONSOLE_USAGE ON dbo.v_R_System.ResourceID = dbo.v_GS_SYSTEM_CONSOLE_USAGE.ResourceID
    Right Join 
    dbo.v_GS_COMPUTER_SYSTEM ON dbo.v_GS_SYSTEM_CONSOLE_USAGE.ResourceID = dbo.v_GS_COMPUTER_SYSTEM.ResourceID
    Right Join
    dbo.v_GS_OPERATING_SYSTEM ON dbo.v_GS_COMPUTER_SYSTEM.ResourceID = dbo.v_GS_OPERATING_SYSTEM.ResourceID 
    

    在哪里

    (Not (dbo.v_GS_OPERATING_SYSTEM.Caption0 Like '%Server%'))
    

    通过...分组

    dbo.v_GS_COMPUTER_SYSTEM.Name0, 
    dbo.v_GS_SYSTEM_CONSOLE_USAGE.TopConsoleUser0,
    dbo.v_R_System.Resource_Domain_OR_Workgr0, 
    dbo.v_GS_OPERATING_SYSTEM.Caption0,
    dbo.v_GS_OPERATING_SYSTEM.CSDVersion0,                     
    dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0,
    dbo.v_GS_COMPUTER_SYSTEM.Model0
    

    订购方式

    [Top Console User]
    

    SCCM 报告名称:上次登录用户/SCCM 客户端在工作站上签入

    解释:

    现在这是我在与资产管理部门交谈后最终需要使用的代码,他们告诉我他们实际上并不需要顶级控制台用户,而是最后登录用户。他们不明白两者之间的区别,所以我不得不向他们解释,然后他们做了一个“哦,我们现在明白了。不,我们需要最后登录用户以及最后一次工作站已签入或在线,谢谢。” 所以,然后我研究了他们能够使用的代码。顺便说一句,此代码不利用 SCCM 资产智能,并且无需启用安全日志审核即可使其正常工作。此外,为了获得工作站“签入”的最后时间,我只是使用最后一次硬件库存扫描来提取此信息。另一件事,要从“dbo.v_GS_COMPUTER_SYSTEM.UserName0”获取真正的最后登录用户,应该每天启用硬件清单扫描,这就是我在 SCCM 环境中配置它的方式,这就是我使用它的原因。但是,如果您没有启用硬件清单以每天运行,那么您应该从“V_GS_NETWORK_LOGIN_PROFILE.Name0”获取最后登录的用户数据。

    SQL 代码:

    选择不同

    dbo.v_GS_COMPUTER_SYSTEM.Name0 AS [Computer Name],
    dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0 AS [Computer Manufacturer],
    dbo.v_GS_COMPUTER_SYSTEM.Model0 AS [Computer Model],
        [Last Logged On User] = CASE WHEN 
                    MAX(dbo.v_GS_COMPUTER_SYSTEM.UserName0) is NULL  
                            THEN 'Uknown' 
                            ELSE dbo.v_GS_COMPUTER_SYSTEM.UserName0 
                            END, 
    dbo.v_R_SYSTEM.Resource_Domain_OR_Workgr0 AS [Domain], 
    dbo.v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System], 
    dbo.v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack],
    dbo.v_GS_WORKSTATION_STATUS.LastHWScan AS [Last SCCM Client Check-In] 
    

    从

    dbo.v_GS_COMPUTER_SYSTEM 
    INNER JOIN
    dbo.v_R_System ON dbo.v_GS_COMPUTER_SYSTEM.ResourceID = dbo.v_R_System.ResourceID
    INNER JOIN
    dbo.v_GS_OPERATING_SYSTEM ON dbo.v_R_System.ResourceID = dbo.v_GS_OPERATING_SYSTEM.ResourceID
    INNER JOIN
    dbo.v_GS_WORKSTATION_STATUS ON dbo.v_GS_OPERATING_SYSTEM.ResourceID = dbo.v_GS_WORKSTATION_STATUS.ResourceID
    

    在哪里

    dbo.v_GS_OPERATING_SYSTEM.Caption0 Not Like '%Server%' and dbo.v_R_SYSTEM.Name0 Not Like 'WN%' 
    

    通过...分组

    dbo.v_GS_COMPUTER_SYSTEM.Name0, 
    dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0,
    dbo.v_GS_COMPUTER_SYSTEM.Model0,
    dbo.v_GS_COMPUTER_SYSTEM.UserName0, 
    dbo.v_R_System.Resource_Domain_OR_Workgr0, 
    dbo.v_GS_OPERATING_SYSTEM.Caption0, 
    dbo.v_GS_OPERATING_SYSTEM.CSDVersion0,
    dbo.v_GS_WORKSTATION_STATUS.LastHWScan
    

    订购方式

    [Computer Name]
    
    • 1

相关问题

  • 我们应该为 Web 应用程序使用哪种排序规则 - SQL Server 2005

  • 用于自定义 sql 负载测试的工具

  • Sql server 2005/2008 添加登录

  • 远程连接 sql server 不工作,但如果防火墙禁用它呢?

  • 开源与专有关系 db mgt 系统的优缺点是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve