我们有两个角色:管理员和客户。有许多默认用户的电子邮件地址遵循以下模式:
然后,我们为每个组合运行脚本(如果是管理员,它会完成两次,因为他们也是客户)。
insert into AspNetUserRoles values(
(select Id from AspNetUsers where Email = 'AAA'),
(select Id from AspNetRoles where Name = 'BBB'))
现在,根据我的问题,您可以猜测它现在是如何解决的。对于每封新电子邮件,我们都会添加一两个声明。如果我们要添加新角色,我们必须添加一些声明,可能与已注册的电子邮件数量一样多。
我觉得在那里宣布表格上的矩阵:
@ .com,role1,role2
b @ .com,role1,
c ^ @ .COM
d @ .com,role1,role3,role4
我已经尝试了一段时间,但无法弄清楚语法。实际的DBA说它不是(容易)可行的,而且我们现在拥有的脚本就是它应该完成的。
我怀疑他已经完成了圣诞糖果的加工但是,我自己不是DBA,我无法真正争辩,除非我有一些有用的东西。我也怀疑我没有以正确的方式进行谷歌搜索(即由于我的无知,我使用了错误的术语来描述我想要的东西)。
意识到这个问题可能会产生误导,我将以speudo-code为例说明我的意图。
List<Link> links = new List<Link> {
new {a1,b1}, new {a1,b2},
new {a2,b2},
new {a3,b1}, new {a3,b3}, new {a3,b4} }
foreach(Link in links)
ExecuteSql(
"insert into Links values(
(select Id from FirstTable where Name = link.A),
(select Id from SecondTable where Name = link.B))"
);
我无法弄清楚的部分是如何声明这样的列表以及如何循环它。
答案 0 :(得分:1)
1)假设我们从创建临时表开始。
-- Create temp table for user and roles
CREATE TABLE #temp(
AspNetUser varchar(1000) ,
AspNetRoles varchar(1000));
2a)从文件填充(例如userroles.csv
)
@。com,role1 | b @ .com,role1 | c @ .com,| d @ .com,role1 role3 role4
喜欢这个
-- Read from csv
BULK INSERT #temp FROM 'D:\userroles.csv'
WITH (
FIELDTERMINATOR =','
,ROWTERMINATOR ='|');
2b)或在脚本中执行您自己的插入
INSERT INTO #temp
(AspNetUser, AspNetRoles)
VALUES
('a@.com','role1'),
('b@.com','role1'),
('c@.com',null),
('d@.com','role1 role3 role4')
3)通过查找ID
将所有组合插入表格中-- Insert all found combinations
INSERT INTO AspNetUserRoles
SELECT users.Id, roles.Id
FROM
(
SELECT AspNetUser,
CAST ('<Role>' + REPLACE(AspNetRoles, ' ', '</Role><Role>') + '</Role>' AS XML) AS Data
FROM #temp
) AS A
CROSS APPLY Data.nodes ('/Role') AS Split(a)
INNER JOIN AspNetUsers users ON users.Email = AspNetUser
INNER JOIN AspNetRoles roles ON roles.Name = Split.a.value('.', 'VARCHAR(100)')
-- Clean up
drop table #textfile;
您可以将分隔符SPACE
,,
和|
更改为您喜欢的内容。
您可能需要对拼写错误进行错误检查!