我有一个Excel工作表,其中包含订单的部件号。我想查询零件的SQL表以查看每个零件是否已经存在,如果不存在,则在单元格中显示“新建”。我已经通过从SQL导入part_number列到excel来做到这一点,然后在VLOOKUP上使用IFERROR来显示消息。
随着工作表越来越大,越来越多的工作人员通过VPN进行远程操作,刷新part_number下载所花费的时间成为一个问题。
是否可以使用Excel中的past_number单元格来使用sql查询,以返回可以用IF或其他测试的值?是否需要遍历excel工作表中的每一行,或者我可以使其更“面向集合”?
答案 0 :(得分:0)
您可以在Excel中创建带有参数的动态查询,以仅提取与您的订单相关的零件号。这是您的操作方式:
要创建新的数据源,请单击确定
输入服务器名称->选择一个驱动程序,然后单击连接
再次输入服务器名称,然后单击“使用信任连接” 或输入SQL 登录ID 和密码(取决于您的环境)- >点击“选项”
选择数据库,然后再次单击确定和确定,因此您将返回到 Choose Data Source (选择数据源)窗口,在该窗口中,您还单击确定
单击下一步 3次-> 完成(默认情况下保留所有内容)->选择放置结果的位置,然后单击确定 >在导入数据窗口上。
注意::我提到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和数据库中均存在,因此您可以轻松地找到数据库中缺少的所有零件编号。这样可以加快工作流程,因为您现在不需要从数据库中提取整个表。