Sql server 检查SQL中是否存在excel单元格值

Sql server 检查SQL中是否存在excel单元格值,sql-server,excel,Sql Server,Excel,我有一个Excel工作表,其中包含订单的零件号。我想查询零件的SQL表,看看每个零件是否已经存在,如果不存在,在单元格中显示“New”。我已经通过将part_number列从sql导入excel,然后在VLOOKUP上使用IFERROR来显示消息来实现了这一点 随着工作表越来越大,越来越多的工作人员通过VPN进行远程访问,刷新零件号下载所需的时间成为一个问题 有没有一种方法可以使用Excel中的sql查询,使用“过去的数字”单元格,返回一个我可以用IF或其他东西测试的值?需要迭代excel工作表

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

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


有没有一种方法可以使用Excel中的sql查询,使用“过去的数字”单元格,返回一个我可以用IF或其他东西测试的值?需要迭代excel工作表中的每一行,或者我可以更“设置”一点吗?

您可以使用excel中的参数创建动态查询,以仅提取与订单相关的零件号。以下是您的操作方法:

  • 转到数据选项卡->从其他来源获取数据->,从Microsoft Query获取数据->
  • 选择“新建数据源”,或者选择一个现有数据源(如果您之前已经创建了SQL server数据源)->单击“确定”:
  • 要创建新的数据源,请单击“确定”

    输入服务器名称->选择驱动程序,然后单击连接

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

    选择您的数据库并再次单击确定确定,这样您就返回到选择数据源窗口,在该窗口中您还可以单击确定

  • 查询窗口-选择列窗口中,选择零件号表和存储零件号名称的列(或按顺序标识零件号的任何内容):
  • 单击下一步三次->完成(默认情况下一切保持不变)->选择结果的放置位置,然后单击导入数据窗口上的确定

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

  • 转到数据选项卡->属性->连接属性->定义选项卡。您可以在此处编辑命令文本:
  • 将其更改为:

    SELECT PartNumbers.[Name] as Name
    FROM TestDB.dbo.PartNumbers PartNumbers 
    WHERE PartNumbers.[Name] in (SELECT value FROM STRING_SPLIT(CAST(? as nvarchar(100)), ','))
    
    注意,我们在上面的SQL查询中有一个问号-它将是筛选零件号的动态参数

  • 再次单击确定连接属性->定义 (需要启用“参数…”按钮)->单击“参数…”
  • 在“参数”窗口中,选择“从以下单元格获取值”
    ,然后选择一个单元格,稍后您将使用该单元格为过滤器添加动态值(现在可以为空)

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

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

  • 现在,如果你做的一切都正确,你应该看到现有的零件号记录是如何从数据库中提取到你在步骤1-5中制作的表中的


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

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