我有一串电子邮件地址。例如,“ a@a.com; b@a.com; c@a.com”
My database is:
record | flag1 | flag2 | emailaddresss
--------------------------------------------------------
1 | 0 | 0 | a@a.com
2 | 0 | 0 | b@a.com
3 | 0 | 0 | c@a.com
我需要做的是解析字符串,如果地址不在数据库中,请添加它。
然后,返回仅包含与电子邮件地址相对应的记录编号的字符串。
因此,如果通过“ A@a.com; c@a.com; d@a.com”进行呼叫,则常规将添加“ d@a.com”,然后返回“ 1、3, 4“与与电子邮件地址匹配的记录相对应。
我现在要做的是每个电子邮件地址调用一次数据库以查找并确认其存在(如果不存在则添加),然后再次循环遍历它们,以从我的Powershell应用程序中逐个获取地址收集记录号。
必须有一种方法可以同时将所有地址传递给SQL,对吗?
我让它在Powershell中工作。但是很慢。
我很喜欢SQL的响应,如上所示,它只是单个响应中每个电子邮件地址的记录号。即“ 1,2,4”等。
我的powershell代码是:
$EmailList2 = $EmailList.split(";")
# lets get the ID # for each eamil address.
foreach($x in $EmailList2)
{
$data = exec-query "select Record from emailaddresses where emailAddress = @email" -parameter @{email=$x.trim()} -conn $connection
if ($($data.Tables.record) -gt 0)
{
$ResponseNumbers = $ResponseNumbers + "$($data.Tables.record), "
}
}
$ResponseNumbers = $($ResponseNumbers+"XX").replace(", XX","")
return $ResponseNumbers
答案 0 :(得分:1)
您必须分两步执行此操作。首先INSERT
使用新值,然后使用SELECT
取回新值。由于您仍在使用SQL Server 2008,因此此答案使用delimitedsplit8k
(而不是delimitedsplit8k_LEAD
)。关于2008年,我强烈建议您在获得大约6周的支持后立即考虑升级路径左。
您可以使用函数拆分值,然后适当地INSERT
/ SELECT
:
DECLARE @Emails varchar(8000) = 'a@a.com;b@a.com;c@a.com';
WITH Emails AS(
SELECT DS.Item AS Email
FROM dbo.DelimitedSplit8K(@Emails,';') DS)
INSERT INTO YT (emailaddress) --I don't know what the other columns value should be, so have excluded
SELECT E.Email
FROM dbo.YourTable YT
LEFT JOIN Emails E ON YT.emailaddress = E.Email
WHERE E.Email IS NULL;
SELECT YT.record
FROM dbo.YourTable YT
JOIN dbo.DelimitedSplit8K(@Emails,';') DS ON DS.Item = YT.emailaddress;