我有一个电子邮件表和一个电话表,我想为我插入的每个电子邮件或电话号码创建共同的客户ID。
就像我插入电子邮件一样:a@a.a
,b@b.b
,c@c.c
,d@d.d
然后插入电话:111-111
,222-222
,333-333
我会得到:
EMAIL | CustomerID
----------------
a@a.a | 1
b@b.b | 2
c@c.c | 3
d@d.d | 4
PHONE | CustomerID
----------------
111-111| 5
222-222| 6
333-333| 7
依此类推,如果我继续为每个表插入
编辑: 我建立了Costumers表并触发了插入电子邮件\电话的操作,但是它仅在每次插入的最后一封电子邮件\电话上起作用:
CREATE TRIGGER [dbo].[tr_insertEmail] ON [dbo].[EmailTB]
instead of INSERT
as
BEGIN
declare @Email nvarchar(max);
select @Email = Email from inserted
INSERT INTO CostumersTB DEFAULT VALUES
INSERT INTO [dbo].[EmailTB] (Email , CostumersID)
values (@Email , IDENT_CURRENT('[dbo].[CostumersTB]'))
END
答案 0 :(得分:1)
对于多行插入,您需要使用循环(无法进行INSERT-SELECT,因为您的客户表上没有更多的值可以与新值连接),请使用OUTPUT
而不是{ {1}}可以防止多个用户同时插入数据时出现问题
IDENT_CURRENT
PS 如果该选项是第一个提供的选项,则不确定为什么要放弃此选项(请参阅问题的注释),但我强烈建议您使用SQL序列
CREATE TRIGGER [dbo].[tr_insertEmail] ON [dbo].[EmailTB]
INSTEAD OF INSERT
as
BEGIN
DECLARE @Email nvarchar(max);
SELECT Email
INTO #Inserted
FROM Inserted
DECLARE @id table(id int)
WHILE EXISTS (SELECT 1 FROM #Inserted)
BEGIN
SELECT TOP 1 @Email = Email FROM #Inserted
DELETE @ID
INSERT INTO CostumersTB
OUTPUT Inserted.CustomersID INTO @id
DEFAULT VALUES
INSERT INTO [dbo].[EmailTB] (Email , CostumersID)
SELECT @Email , ID FROM @id
DELETE #Inserted WHERE Email = @Email
END
END
并将您的序列用作表的默认约束
CREATE SEQUENCE dbo.CustomersSeq START WITH 1 INCREMENT BY 1;