Добавление нескольких записей из строки - PullRequest
0 голосов
/ 03 июня 2019

У меня есть строка адресов электронной почты.Например, «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 ", соответствующие записям, которые соответствуют адресам электронной почты.

Что ясейчас я вызываю базу данных один раз для каждого адреса электронной почты, чтобы найти ее и подтвердить, что она существует (добавляя, если она не существует), а затем повторяю их снова, чтобы получить адреса 1 на 1 из моего приложения 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

1 Ответ

1 голос
/ 03 июня 2019

Вы должны сделать это в 2 шага.Сначала INSERT новые значения, а затем используйте SELECT, чтобы вернуть значения.В этом ответе используется delimitedsplit8k (не delimitedsplit8k_LEAD), поскольку вы все еще используете SQL Server 2008. В заметке 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...