【发布时间】: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_Date是nvarchar,因为您将nvarchar文字传递给它;你只能用nvarchar来做。使用字符串时,日期最好作为varchar值,格式为yyyyMMdd或yyyy-MM-ddThh:mm:ss.nnnnnnn但真的您应该将它们作为日期和时间数据类型传递(尽管如果您确实需要使用STRING_SPLIT方法)。
标签: sql sql-server vba ssms