SQL迁移脚本:插入到,但从中选择多个

SQL迁移脚本:插入到,但从中选择多个,sql,sql-server,select,insert,Sql,Sql Server,Select,Insert,我试图在一个表中插入多行,我基本上想要一个嵌套循环。我有以下建议代码: with Permissions (Id) as ( select Id from Surge.Permission where Name in ( 'Web.Orders:Enable', 'App.Orders:Enable', 'Web.Orders:View', 'App.Orders:View', 'Web.Orders:Mo

我试图在一个表中插入多行,我基本上想要一个嵌套循环。我有以下建议代码:

with Permissions (Id) as
(
    select Id from Surge.Permission  where Name in (
        'Web.Orders:Enable',
        'App.Orders:Enable',
        'Web.Orders:View',
        'App.Orders:View',
        'Web.Orders:Modify',
        'App.Orders:Modify',
        'Web.Orders:View.All',
        'App.Orders:View.All'
    )
)

insert Surge.[RolePermission] (DataPartitionId, PermissionId, RoleId)
select DP.Id, Permissions.Id, 2 from Surge.DataPartition as DP
不过,这似乎不对(LINQPad似乎不喜欢它;它似乎找不到
权限.Id
)。如何使用常规SQL实现这一点?基本上,我希望输出为:

1, 1, 2
1, 2, 2,
1, 3, 2
...
2, 1, 2
2, 2, 2
2, 3, 2

依此类推,就像一个嵌套循环。

根据示例数据冒险猜测您想要
Permission.ID
DataPartition.ID
的每个组合:

with Permissions as
   (select Id 
    from Surge.Permission  
    where Name in ('Web.Orders:Enable',
                   'App.Orders:Enable',
                   'Web.Orders:View',
                   'App.Orders:View',
                   'Web.Orders:Modify',
                   'App.Orders:Modify',
                   'Web.Orders:View.All',
                  'App.Orders:View.All'
                  )
     )
INSERT INTO Surge.[RolePermission] (DataPartitionId, PermissionId, RoleId)
SELECT DP.Id, p.Id, 2 
FROM Surge.DataPartition as DP
CROSS JOIN Permissions p

如果不是这样,您可以将
交叉连接
更改为另一个
连接
类型并添加条件。

cte的目的是什么?您没有在insert/select语句中引用它。@GoatCO我已经编辑了代码。我在那里犯了一些错误,可能是我错误地复制了同事给我的原始代码片段的一部分。您的编辑去掉了讨厌的代码(id,2),但仍然没有引用select中的cte。
具有权限
即cte。带构造的SQL是一个公共表表达式(cte)。这很有效!我以前尝试过JOIN语句,但遇到了一些问题-我想我做错了什么。不过,交叉连接工作得很好。非常感谢。