如何基于数组

时间:2016-01-03 11:54:39

标签: sql sql-server azure

我们有两个角色:管理员客户。有许多默认用户的电子邮件地址遵循以下模式:

  1. 管理员 - admin1 @ .com admin2 @ .com 等。
  2. 客户 - user1 @ .com user2 @ .com 等。
  3. 然后,我们为每个组合运行脚本(如果是管理员,它会完成两次,因为他们也是客户)。

    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))"
      );
    

    我无法弄清楚的部分是如何声明这样的列表以及如何循环它。

1 个答案:

答案 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,|更改为您喜欢的内容。

  • 您可能需要对拼写错误进行错误检查!