Sql 在插入到另一个表时使用触发器将多行插入到一个表中

Sql 在插入到另一个表时使用触发器将多行插入到一个表中,sql,sql-server,tsql,triggers,sql-insert,Sql,Sql Server,Tsql,Triggers,Sql Insert,我试图创建一个T-SQL触发器,它将根据插入原始表中的数据和包含在第二个表中的数据向第三个表中插入x行;但是,我在insert语句的select部分遇到了各种各样的错误 如果我在[qmgmt].[dbo].[skillColumns].[columnID]中从[qmgmt].[dbo].[skillColumns]选择columnID中注释掉这部分[qmgmt].[dbo].[skillColumns].[columnID],IntelliSense将去掉所有红线 表格设计: 用户表-包含用户信

我试图创建一个T-SQL触发器,它将根据插入原始表中的数据和包含在第二个表中的数据向第三个表中插入x行;但是,我在insert语句的select部分遇到了各种各样的错误

如果我在[qmgmt].[dbo].[skillColumns].[columnID]中从[qmgmt].[dbo].[skillColumns]选择columnID中注释掉这部分[qmgmt].[dbo].[skillColumns].[columnID],IntelliSense将去掉所有红线

表格设计:

用户表-包含用户信息 skillColumns表-根据用户的productGroupID筛选的所有可能列的列表 Skills表-包含每个用户的数据,skillColumns中每个columnID对应一行 创建触发器tr\u用户\u插入 在[qmgmt].[dbo].[Users]上 插入后 像 开始 插入[qmgmt].[dbo].[Skills][userID],[displayName],[columnID] 选择[iTable]。[userID], [iTable][displayName], [cID]在[qmgmt].[dbo].[skillColumns]中选择[columnID]作为[cID] 从插入为[iTable]内部联接 打开[qmgmt].[dbo].[skillColumns] [iTable].[productGroupID]=[qmgmt].[dbo].[skillColumns].[groupID] 终止 去 我想用触发器来完成的事情可能吗?可以使用in关键字将多行插入到表中吗

更新: 使用J0e3gan提供的答案后,我能够在相反方向创建触发器:

创建触发器tr\u skillColumns\u INSERT\u用户 在[qmgmt].[dbo].[skillColumns]上 插入后 像 开始 进入[qmgmt].[dbo].[Skills][userID],[displayName],[columnID] 选择[qmgmt].[dbo].[Users].[userID], [qmgmt].[dbo].[Users].[displayName], [iTable][columnID] 从插入为[iTable]内部联接 上的[qmgmt].[dbo].[Users] [iTable].[groupID]=[qmgmt].[dbo].[Users].[productGroupID] 哪里 [qmgmt].[dbo].[Users].[userID]在[qmgmt].[dbo].[Users]中选择[userID] 终止 去
是的,这可以通过后触发器完成

列列表不是您尝试使用的IN标准的正确位置,这就是为什么它用红色下划线的原因

请尝试将IN条件添加到联接条件:

CREATE TRIGGER tr_Users_INSERT 
   ON [qmgmt].[dbo].[Users]
   AFTER INSERT
AS 
BEGIN
    INSERT into [qmgmt].[dbo].[Skills]([userID], [displayName], [columnID]) 
    Select [iTable].[userID], 
           [iTable].[displayName], 
           [qmgmt].[dbo].[skillColumns].[columnID]
    From inserted as [iTable] inner join 
        [qmgmt].[dbo].[skillColumns] on 
        [iTable].[productGroupID] = [qmgmt].[dbo].[skillColumns].[groupID] and
        [qmgmt].[dbo].[skillColumns].[columnID] in (select columnID from [qmgmt].[dbo].[skillColumns])
END
GO
或者将其添加到WHERE子句中:


你能详细说明一下吗?如果我有错误的位置,请帮助我学习正确的位置。@BrandonB:当然-是这样。}我补充了一些重构的考虑。我选择在Where子句中使用in,因为我能够在头脑中更容易地阅读它,而且由于我需要编写许多触发器,可读性将是一个关键因素。再次感谢您的快速回复,如果我能再次投票给您这个答案,我会立刻投票。
CREATE TRIGGER tr_Users_INSERT 
   ON [qmgmt].[dbo].[Users]
   AFTER INSERT
AS 
BEGIN
    INSERT into [qmgmt].[dbo].[Skills]([userID], [displayName], [columnID]) 
    Select [iTable].[userID], 
           [iTable].[displayName], 
           [qmgmt].[dbo].[skillColumns].[columnID]
    From inserted as [iTable] inner join 
        [qmgmt].[dbo].[skillColumns] on 
        [iTable].[productGroupID] = [qmgmt].[dbo].[skillColumns].[groupID]
    Where
        [qmgmt].[dbo].[skillColumns].[columnID] in (select columnID from [qmgmt].[dbo].[skillColumns])
END
GO