从字符串中添加多条记录
Adding multiple records from a string
我有一串电子邮件地址。例如,"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
我需要做的是解析字符串,如果地址不在数据库中,添加它。
然后,return一串与电子邮件地址相对应的记录编号。
所以,如果用"A@a.com; c@a.com; d@a.com"进行调用,rountine会添加"d@a.com",然后return“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
您必须分两步完成此操作。首先 INSERT
新值,然后使用 SELECT
取回值。此答案使用 delimitedsplit8k
(not 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;
我有一串电子邮件地址。例如,"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
我需要做的是解析字符串,如果地址不在数据库中,添加它。
然后,return一串与电子邮件地址相对应的记录编号。
所以,如果用"A@a.com; c@a.com; d@a.com"进行调用,rountine会添加"d@a.com",然后return“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
您必须分两步完成此操作。首先 INSERT
新值,然后使用 SELECT
取回值。此答案使用 delimitedsplit8k
(not 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;