У меня есть таблица, которая выглядит так:
CREATE TABLE [dbo].[SomeTable](
[Guid] [uniqueidentifier] NOT NULL,
[Column1] [int] NOT NULL,
[Column2] [datetime] NOT NULL,
[Column3] [bit] NOT NULL,
[Column4] [smallint] NOT NULL,
[Column5] [uniqueidentifier] NULL,
[Column6] [varchar](100) NULL,
[Column7] [datetime] NULL,
[Column8] [datetime] NULL,
CONSTRAINT [pkSomeTable] PRIMARY KEY CLUSTERED
(
[Guid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
)
ПРИМЕЧАНИЕ: имена были изменены, чтобы защитить невинных.
Через хранимую процедуру я выполняю этот запрос:
SELECT SomeTable.Guid, SomeTable.Column1, SomeTable.Column2, SomeTable.Column3, SomeTable.Column4, SomeTable.Column5, SomeTable.Column6, SomeTable.Column7, SomeTable.Column8
FROM SomeTable
WHERE SomeTable.Guid = @Guid
ORDER BY SomeTable.Guid
После этого я получаю:
Нарушение ограничения PRIMARY KEY 'pkSomeTable'. Невозможно вставить дубликат ключа в объект 'dbo.SomeTable'.
UniqueKeyConstraintException: дубликат ключа.
Я очень озадачен тем, как у меня может быть исключение, подобное этому, выполняющее только оператор выбора. На столе нет триггеров. У кого-нибудь есть идеи о том, как это может произойти?
Edit:
Весь STP:
CREATE PROCEDURE dbo.stpSelectSomeTable
@Guid UNIQUEIDENTIFIER = NULL
AS
BEGIN
SET NOCOUNT ON
IF (@Guid is NULL)
SELECT SomeTable.Guid, SomeTable.Column1, SomeTable.Column2, SomeTable.Column3, SomeTable.Column4, SomeTable.Column5, SomeTable.Column6, SomeTable.Column7, SomeTable.Column8
FROM SomeTable
ORDER BY SomeTable.Guid
Else
SELECT SomeTable.Guid, SomeTable.Column1, SomeTable.Column2, SomeTable.Column3, SomeTable.Column4, SomeTable.Column5, SomeTable.Column6, SomeTable.Column7, SomeTable.Column8
FROM SomeTable
WHERE SomeTable.Guid = @Guid
ORDER BY SomeTable.Guid
END
GO
Я уверен, что GUID не равен нулю, когда вызывается этот STP. Я также уверен, что это утверждение вызвало проблему. Трассировка стека исключения показывает мне это. Оказывается, база данных, в которой это произошло, была удалена и восстановлена в предыдущей версии. Из-за этого я не могу проверить утверждение. Это было сделано до того, как этот вопрос был передан мне.