SQL使用一个静态值和一个变量插入多行

SQL使用一个静态值和一个变量插入多行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我们的数据库具有以下设置: SiteSecurityID | SiteID | LoginName ---------------+--------+----------- Auto Gen # Number Username 现在,我们有35个SiteID,每个用户都需要访问每个SiteID。我无法获得任何查询,我已成功尝试执行此操作 我可以用这个方法一个接一个地做,但必须有一个更简单的方法 INSERT INTO SiteSecurity (SiteID, LoginNam

我们的数据库具有以下设置:

SiteSecurityID | SiteID | LoginName
---------------+--------+-----------
Auto Gen #       Number   Username
现在,我们有35个SiteID,每个用户都需要访问每个SiteID。我无法获得任何查询,我已成功尝试执行此操作

我可以用这个方法一个接一个地做,但必须有一个更简单的方法

INSERT INTO SiteSecurity (SiteID, LoginName) 
VALUES ('1', 'user1'), ('2', 'user1');

您可以使用交叉联接生成所有行,前提是您有站点和用户的表:

INSERT INTO SiteSecurity (SiteID, LoginName)
    SELECT s.SiteId, u.UserName
    FROM Sites s CROSS JOIN
         users u;
如果没有,您仍然可以动态生成它们。表构造函数因数据库而异,但这提供了一种方法:

INSERT INTO SiteSecurity (SiteID, LoginName)
    SELECT s.SiteId, u.UserName
    FROM (VALUES (1), (2), (3), . . . ) s(SiteID) CROSS JOIN
         (VALUES ('user1'),  ('user2'), . . . ) u(UserName);
编辑:

如果已有数据,则可以在插入之前过滤掉重复数据:

INSERT INTO SiteSecurity (SiteID, LoginName)
    SELECT s.SiteId, u.UserName
    FROM (VALUES (1), (2), (3), . . . ) s(SiteID) CROSS JOIN
         (VALUES ('user1'),  ('user2'), . . . ) u(UserName) LEFT JOIN
         SiteSecurity ss
         ON ss.SiteId = s.SiteId AND ss.LoginName = u.UserName
    WHERE ss.SiteId IS NULL;

这些表格的程序简直是噩梦。我们正在将我们的用户与另一个集合合并,因此那里有现有数据。第二个解决方案有效!非常感谢你,戈登!OP的更多好处:保留对SiteSecurity表的联接,并将SiteSecurity.SiteID为NULL添加到WHERE,以确保不插入重复项,这可能是有益的