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

时间:2019-02-13 16:46:44

标签: sql-server excel

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

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

是否可以使用Excel中的past_number单元格来使用sql查询,以返回可以用IF或其他测试的值?是否需要遍历excel工作表中的每一行,或者我可以使其更“面向集合”?

1 个答案:

答案 0 :(得分:0)

您可以在Excel中创建带有参数的动态查询,以仅提取与您的订单相关的零件号。这是您的操作方式:

  1. 转到数据标签-> 获取数据-> 从其他来源-> 从Microsoft Query

Excel, get data from Microsoft Query

  1. 选择新数据源,或者如果您之前已经创建过SQL Server数据源,则选择一个现有数据源->单击“确定”:

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

Excel, Microsoft Query, create new SQL Server datasource

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

Excel, Microsoft Query, connect

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

Excel, Microsoft Query, database options

选择数据库,然后再次单击确定确定,因此您将返回到 Choose Data Source (选择数据源)窗口,在该窗口中,您还单击确定

Excel, Microsoft Query, select existing datasource

  1. 查询窗口-选择列窗口中,选择PartNumbers表,并在其中存储部件号名称(或用来按顺序标识它的名称)的列:

Query Wizard - Choose Columns

单击下一步 3次-> 完成(默认情况下保留所有内容)->选择放置结果的位置,然后单击确定 >在导入数据窗口上。

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

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

Microsoft Query: Change Command Text

将其更改为:

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. 再次点击确定连接属性-> 定义 (需要启用“参数...” 按钮)->单击“参数...”

Microsoft Query: Parameters

参数窗口中,选择“从以下单元格获取值” ,然后选择一个单元格,稍后将使用该单元格为过滤器添加动态值(它可以暂时为空)。

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

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

  2. 现在,如果您做对了所有事情,您应该看到在步骤1-5中如何将现有零件号记录从数据库中提取到表中。

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