【问题标题】:SQL Where IN CLAUSE VariableSQL Where IN CLAUSE 变量
【发布时间】:2021-04-19 12:36:46
【问题描述】:

我有一个过程,我基本上必须通过电子表格并在内部系统上按姓名/姓氏和出生日期逐个查找个人姓名,然后检索他们参加的设置。

我已获得对数据库的访问权限,并且我以前使用过 SQL,但没有什么广泛的经验。我为我的表设置了如下的虚拟名称,只是因为它可能包含敏感信息。

我想知道我是否可以以更简单的方式做到这一点,我最终将通过 VBA 连接到数据库并以这种方式检索数据。我不知道我是否可以在 IN 子句中插入一个变量并创建一个自定义函数,该函数创建一个变量,该变量将返回类似“Bob”、“Keith”等内容,以便可以将其传递给 SQL(希望这是有道理的) )。另外,如果您通过 VBA 传递 SQL,是否可以传递缩写的表名?

我也不确定是否可以在正确的行上返回设置,或者最好在多个条件上使用一些查找函数?

这不是我知道的做事的好方法,但它是唯一的方法,因为每个人在我最初收到的数据中都没有唯一标识符。

SELECT  p.Forename
      ,p.Surname
      ,p.Birth_Date
      ,p.xxx
      ,p.xxx
      ,csc.name
      ,cs.name2 
FROM dbo.Person AS P
INNER JOIN dbo.banana AS csc ON csc.xxx = p.xxx
INNER JOIN dbo.apple AS cs ON cs.xxx = p.xxx
WHERE p.forename IN('xxx', 'xxx', 'xxx', 'xxx')
  AND p.surname IN('xx','xx','xx', 'xx')
  AND p.Birth_Date IN(N'xx', N'xxx', N'xxx', N'xxx')

【问题讨论】:

  • 如果您从任何程序运行此查询,则可以传递数组类型的变量。
  • 您是否将日期存储在 nvarchar 列中?
  • 执行此操作的规范方法是使用 TVP,但 VBA 中使用的老式 ADO 驱动程序不支持它。也许是一个 CSV,然后用 STRING_SPLIT 拆分它?
  • 嗨@jarlh 日期是日期,我想它不需要用撇号吗?
  • 不,它不需要符号字符 (N) @paulr23。 N'xx' 暗示您的列 Birth_Datenvarchar,因为您将 nvarchar 文字传递给它;你只能用nvarchar 来做。使用字符串时,日期最好作为 varchar 值,格式为 yyyyMMddyyyy-MM-ddThh:mm:ss.nnnnnnn真的您应该将它们作为日期和时间数据类型传递(尽管如果您确实需要使用STRING_SPLIT 方法)。

标签: sql sql-server vba ssms


【解决方案1】:

根据您的控制和访问权限,您可以使用 XML 传递值列表。

这是我的意思的一个例子:

DECLARE
    @forenames xml = '<names><name>Bill</name><name>Steven</name><name>Steve</name></names>',
    @surnames xml = '<names><name>Gates</name><name>Spielberg</name><name>Jobs</name></names>',
    @birthdates xml = '<dates><date>10/28/1955</date><date>12/18/1946</date><date>02/24/1955</date></dates>';

SELECT 
    p.Forename
    , p.Surname
    , p.Birth_Date
    , p.xxx
    , p.xxx
    , csc.name
    , cs.name2 
FROM dbo.Person AS P
INNER JOIN dbo.banana AS csc ON csc.xxx = p.xxx
INNER JOIN dbo.apple AS cs ON cs.xxx = p.xxx
WHERE 
    p.forename IN(
        SELECT x.f.value( '.', 'varchar(50)' ) FROM @forenames.nodes( '//names/name' ) x( f )
    )
    AND p.surname IN(
        SELECT x.f.value( '.', 'varchar(50)' ) FROM @surnames.nodes( '//names/name' ) x( f )
    )
    AND p.Birth_Date IN(
        SELECT x.f.value( '.', 'varchar(50)' ) FROM @birthdates.nodes( '//dates/date' ) x( f )
    );

【讨论】:

  • 感谢您的建议,您能否解释一下这到底是什么,因为我不太了解它。我如何将值传递到 xml 中,这将是手动的吗?
  • 这允许您通过 XML 中的字符串传递值列表,该字符串可与 IN 一起使用。
猜你喜欢
  • 2020-09-13
  • 2022-12-27
  • 2022-01-21
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多