Я получаю следующую ошибку, если я запускаю хранимую процедуру
Невозможно вставить строку с повторяющимся ключом в объект "dbo.tabTac" с уникальным индексом
«IX_tabTac».
Уникальный индекс IX_tabTac
:
CREATE UNIQUE NONCLUSTERED INDEX [IX_tabTac] ON [dbo].[tabTAC]
(
[TAC] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
Таблица tabTac
:
CREATE TABLE [dbo].[tabTAC](
[idTAC] [int] IDENTITY(1,1) NOT NULL,
[TAC] [char](8) NOT NULL,
[fiModel] [int] NOT NULL,
CONSTRAINT [PK_tabTac] PRIMARY KEY CLUSTERED
(
[idTAC] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tabTAC] WITH NOCHECK ADD CONSTRAINT [FK_tabTac_modModel] FOREIGN KEY([fiModel])
REFERENCES [dbo].[modModel] ([idModel])
GO
ALTER TABLE [dbo].[tabTAC] CHECK CONSTRAINT [FK_tabTac_modModel]
Хранимая процедура InsertTacsFromClaims
:
CREATE PROC [dbo].[InsertTacsFromClaims]
with execute as Owner
AS
BEGIN
INSERT INTO tabTac
select substring(t.SSN_Number,1,8)as TAC
,m.idModel as fiModel
from tabData t
inner join modmodel m
ON t.fimodel=m.idmodel
WHERE t.fiproducttype=1
and m.idModel>1
and not exists(
select fiModel from tabTac WHERE TAC=substring(t.SSN_Number,1,8)
)
GROUP BY substring(t.SSN_Number,1,8),m.idModel
END
RETURN @@ROWCOUNT;
Я бы подумал, что предотвратил эту ошибку с помощью:
and not exists(
select fiModel from tabTac WHERE TAC=substring(t.SSN_Number,1,8)
)
Редактировать
@ Второй запрос Sparkys (добавлено ModelName) возвращает следующее:
TAC fiModel ModelName
01233300 777 U5A
01238300 771 W20I
01238300 784 W20
35427603 720 C903
35773704 781 E15I
35905104 451 W595
35946804 793 W150I
35959004 813 ST18I
Теперь очевидно, что один TAC в tabData (первые 8 символов SSN_Number) не имеет отдельной модели, но может быть связан с несколькими моделями. Это вызывает ошибку, потому что в tabTac TAC должен быть уникальным.
Заранее спасибо