【问题标题】:check if excel cell value exists in SQL检查SQL中是否存在excel单元格值
【发布时间】:2019-02-13 16:46:44
【问题描述】:

我有一个 Excel 工作表,其中包含订单的部件号。我想查询零件的 SQL 表以查看每个零件是否已经存在,如果不存在,则在单元格中显示“新建”。我已经通过将 part_number 列从 sql 导入到 excel 来做到这一点,然后在 VLOOKUP 上使用 IFERROR 来显示消息。

随着工作表越来越大,越来越多的工作人员通过 VPN 远程访问,刷新 part_number 下载所需的时间成为一个问题。

有没有办法使用 Excel 中的 sql 查询,使用 past_number 单元格,返回一个我可以用 IF 或其他东西测试的值?需要遍历 excel 工作表中的每一行,还是我可以更“设置”为导向?

【问题讨论】:

  • 第一次查询表时为什么不将其作为人工列包含在内?
  • 我认为“遍历每一行并查询数据库以查找匹配项”将比仅拖动部分并进行 vlookup 慢得多。您的另一个选择是在 sql server 上创建一个临时表,将您的 excel 表加载到其中,然后查询以查看现有 SQL 表中缺少哪些表并将结果发回。对于@TabAlleman,这个“包含订单零件号的表格”来自哪里?如果它来自同一个 sql server,那么您可以在将结果转换为 excel 之前执行此查询。
  • 对不起大家,我看到我问这个的方式很混乱。我有一个带有 part_numbers 的 EXCEL 订单表,我需要根据 SQL 中的零件号表进行验证。目前,我将 SQL 表中的零件编号列导入到 EXCEL 中的隐藏选项卡中。然后,我在订单表的单元格中使用公式通过 SQL 导入来查找隐藏选项卡。我想看看我是否在不从 SQL 导入零件号的情况下做同样的事情,而是查询 SQL 表以查看零件是否已经存在。
  • Excel 没有表格,它有工作表。这就是混乱的根源。
  • 我认为您只是在低效地存储数据。您应该将跨国数据存储在数据库表中。这允许针对较小的参考数据集(即产品数据和定价等)快速有效地查询和检查大量数据。

标签: sql-server excel


【解决方案1】:

您可以在 Excel 中使用参数创建动态查询,以仅提取与您的订单相关的零件编号。这是你的做法:

  1. 转到数据选项卡 -> 获取数据 -> 来自其他来源 -> 来自 Microsoft Query

  1. 选择新建数据源,如果您之前已经创建过 SQL Server 数据源,则选择现有的 -> 点击确定:

要创建新数据源,请单击确定

输入服务器名称 -> 选择驱动程序并点击连接

再次输入服务器名称并点击“使用信任连接”或输入SQL 登录ID密码(取决于您的环境) - > 点击“选项”

选择您的数据库并再次点击OKOK,这样您将返回到Choose Data Source窗口,您还可以点击好的

  1. 查询窗口 - 选择列 窗口中,选择您的 PartNumbers 表和存储部件号名称(或用于在订单中识别它的任何名称)的列:

单击下一步 3 次 -> 完成(默认保持一切不变)-> 选择放置结果的位置并单击 确定导入数据窗口中。

注意:我提到Microsoft Query 不能很好地处理nvarchar(MAX) 类型。在我的测试中,如果我有一个带有 nvarchar(MAX) 的列,当我将它导入 Excel 工作表时,我会看到该列的空值。

  1. 转到数据标签 -> 属性 -> 连接属性 -> 定义标签。您可以在此处编辑命令文本

将其更改为:

SELECT PartNumbers.[Name] as Name
FROM TestDB.dbo.PartNumbers PartNumbers 
WHERE PartNumbers.[Name] in (SELECT value FROM STRING_SPLIT(CAST(? as nvarchar(100)), ','))

注意,我们在上面的 SQL 查询中有一个问号 - 这将是您过滤零件编号的动态参数。

  1. 再次点击OKConnection Properties -> Definition (需要启用“参数...”按钮)->点击“参数...”

Parameters 窗口中选择 "Get the value from the following cell" 并选择稍后您将使用的单元格为过滤器添加动态值(它现在可以为空)。

您也可以勾选“当单元格值改变时自动刷新”选项。然后在所有打开的窗口上单击确定按钮,这样您就回到了现在应该没有行的 excel 表。

  1. 现在转到您用作参数的空单元格并输入以下公式:=TEXTJOIN(",",TRUE,[PartNumberValuesRange])。 [PartNumberValuesRange] 必须更改为包含您订单中所有部件号的范围。

  2. 现在,如果您做的一切都正确,您应该会看到现有零件编号记录是如何从数据库中提取到您在步骤 1-5 中创建的表中的。

此时您可以使用 VLOOKUP + IFERROR 方法来显示相应的消息。您在公式中引用的表格将只有一部分零件编号,这些零件编号在您的 Excel 和数据库中的订单中都存在,因此您可以轻松找到数据库中缺少的所有零件编号。这应该会加快您的工作流程,因为您现在不需要从数据库中提取整个表。

【讨论】:

  • 哇,彼得写的超级棒。谢谢。我会在今天晚些时候或明天试一试。
  • 你有机会尝试吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多