Sql server 获取SQL/Excel中的无效列名

Sql server 获取SQL/Excel中的无效列名,sql-server,excel,Sql Server,Excel,首先,我要说的是,我远不是SQL方面的专家。使用Excel,我试图使用一个特定的单元格作为查询输入,但遇到了一个问题,即我创建的列没有定义为列。请帮忙 SELECT CASE WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END AS IPADDRESS, ADMachine.ADMachineNa

首先,我要说的是,我远不是SQL方面的专家。使用Excel,我试图使用一个特定的单元格作为查询输入,但遇到了一个问题,即我创建的列没有定义为列。请帮忙

 SELECT
CASE  
WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END AS IPADDRESS,   
ADMachine.ADMachineName, ADMachine.SerialNumber, 
ADMachine.OperatingSystem, ADUsers.ADUser, ADUsers.ADDisplayName, employee_data.employee_first_name, 
employee_data.employee_last_name, asset_center.LOCATION_SITENAME, asset_center.TCPIPHOSTNAME, 
asset_center.MAC_ADDRESS, ADUsers.ADUserOU
FROM PC_GAP.dbo.ADMachine ADMachine, PC_GAP.dbo.ADUsers ADUsers, PC_GAP.dbo.asset_center asset_center, PC_GAP.dbo.employee_data employee_data
WHERE ADUsers.ADUser = employee_data.employee_user_name AND ADMachine.SerialNumber = asset_center.SERIALNO AND ADUsers.ADUser = asset_center.LAST_LOGGED_ON_USER 
最后的IPAddress就是问题所在


编辑1:添加SQL语句中的附加信息以描绘整个画面(最初忽略了不相关的数据)

您不能在WHERE子句中使用列别名。你必须使用你用别名表示的整个公式

WHERE ADMachine.SerialNumber = asset_center.SERIALNO AND ((CASE  
WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END=?))
为了说明Aaron的建议,它看起来更像这样:

WITH cte AS (
SELECT    
CASE  
  WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END AS IPADDRESS,   
ADMachine.ADMachineName,  
ADMachine.OperatingSystem,
asset_center.MAC_ADDRESS,

FROM PC_GAP.dbo.ADMachine ADMachine, PC_GAP.dbo.ADUsers ADUsers, PC_GAP.dbo.asset_center asset_center, PC_GAP.dbo.employee_data employee_data
)
  SELECT * FROM cte
WHERE ADMachine.SerialNumber = asset_center.SERIALNO AND ((IPAddress=?))

不能在WHERE子句中使用列别名。你必须使用你用别名表示的整个公式

WHERE ADMachine.SerialNumber = asset_center.SERIALNO AND ((CASE  
WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END=?))
为了说明Aaron的建议,它看起来更像这样:

WITH cte AS (
SELECT    
CASE  
  WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END AS IPADDRESS,   
ADMachine.ADMachineName,  
ADMachine.OperatingSystem,
asset_center.MAC_ADDRESS,

FROM PC_GAP.dbo.ADMachine ADMachine, PC_GAP.dbo.ADUsers ADUsers, PC_GAP.dbo.asset_center asset_center, PC_GAP.dbo.employee_data employee_data
)
  SELECT * FROM cte
WHERE ADMachine.SerialNumber = asset_center.SERIALNO AND ((IPAddress=?))

好的,首先,出于列出的所有原因,您需要停止使用旧式联接

您还将遇到一个问题,除了您的一个表之外,您不会加入任何其他内容。我很确定这不会给你你想要的结果

最后,你需要考虑一下这个顺序。由于
WHERE
子句是在select之前计算的,因此不能在WHERE子句中引用您的别名。只能通过或使用子查询或cte引用具有订单的别名

但是,您可以在
where
子句中使用大小写表达式。示例如下

CASE
  WHEN CHARINDEX(',', TCPIPADDRESS) > 0 
  THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) 
  ELSE TCPIPADDRESS 
END = ?  
如前所述,您还可以将整个内容转换为子查询。我会用你的代码作为一个例子,但我不完全确定你希望用你当前的连接集实现什么,所以我的例子有点通用

select
    GenericColumn
    (select
        blah as Pity,
        GenericColumn
    from dbo.TheFoo)
where Pity = SeachCondition

好的,首先,出于列出的所有原因,您需要停止使用旧式联接

您还将遇到一个问题,除了您的一个表之外,您不会加入任何其他内容。我很确定这不会给你你想要的结果

最后,你需要考虑一下这个顺序。由于
WHERE
子句是在select之前计算的,因此不能在WHERE子句中引用您的别名。只能通过或使用子查询或cte引用具有订单的别名

但是,您可以在
where
子句中使用大小写表达式。示例如下

CASE
  WHEN CHARINDEX(',', TCPIPADDRESS) > 0 
  THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) 
  ELSE TCPIPADDRESS 
END = ?  
如前所述,您还可以将整个内容转换为子查询。我会用你的代码作为一个例子,但我不完全确定你希望用你当前的连接集实现什么,所以我的例子有点通用

select
    GenericColumn
    (select
        blah as Pity,
        GenericColumn
    from dbo.TheFoo)
where Pity = SeachCondition


这允许我使用单元格作为排序/筛选条件吗?或者更简单的方法是在CTE、子查询、派生表等中派生表达式。然后外部查询可以在任何子句中使用别名。@MilesCurtis我不知道,因为我不是Excel专家。我只知道这将解决您的SQL语法问题。你也可以试试Aaron的建议,看看它们中的一个或两个是否适合你的Excel。我会给你一个机会,然后报告回来!当我尝试此操作时,整个where零件列表无法绑定,这是否允许我使用单元格作为排序/筛选条件?或者更简单的方法是在CTE、子查询、派生表中派生表达式,等等。然后外部查询可以在任何子句中使用别名。@MilesCurtis我不知道,因为我不是Excel专家。我只知道这将解决您的SQL语法问题。你也可以试试Aaron的建议,看看它们中的一个或两个是否适合你的Excel。我会给你一个机会,然后报告回来!当我尝试此操作时,整个where零件列表无法显示,您遇到了什么问题?您得到的错误是什么?更多的细节将有助于我在excel/microsoft query中输入此代码。当我添加最后一位[和((IPAddress=?)]以允许我设置单元格作为“?”的参数时,我得到一个错误,该错误表示列名无效。您遇到了什么问题?您得到的错误是什么?更多的细节将有助于我在excel/microsoft query中输入此代码。当我添加最后一位[和((IPAddress=?)]以允许我设置单元格作为“?”的参数时,我得到一个错误,该错误表示列名无效。我们基本上是想让您可以输入IP地址,并查看谁拥有这台机器以及机器背后的一些信息。不幸的是,我们不拥有任何数据,而那些确实对数据进行了可怕处理的团体。IP地址字段有时仅包含一个IPv4地址,有时包含由逗号分隔的IPv4和IPv6地址。我们只想在IPv4上搜索。是的,但是您定义联接的方式会给您一个笛卡尔乘积。您还可以添加一些糖,用一个可能较短的表达式替换大小写表达式:
ISNULL(左(TCPIPADDRESS,NULLIF(CHARINDEX(',',',,TCPIPADDRESS),0)-1),TCPIPADDRESS)
。我们基本上是想让您可以输入一个IP地址,看看谁拥有这台机器以及它背后的一些信息。不幸的是,我们不拥有任何数据,而那些确实对数据进行了可怕处理的团体。IP地址字段有时仅包含一个IPv4地址,有时包含由逗号分隔的IPv4和IPv6地址。我们只想在IPv4上搜索。是的,但您定义联接的方式将为您提供一个笛卡尔乘积。您还可以添加一些糖,用一个可能较短的大小写表达式替换大小写表达式:
ISNULL(左(TCPIPADDRESS,NULLIF(CHARINDEX(',',',,TCPIPADDRESS),0)-1),TCPIPADDRESS)