Я только что переместил базу данных из экземпляра SQL 2000 в экземпляр SQL 2008 и обнаружил странную проблему, которая, по-видимому, связана со столбцами IDENTITY и хранимыми процедурами.
У меня есть ряд сохраненныхпроцедуры в базе данных в соответствии с этими
create procedure usp_add_something @somethingId int, @somethingName nvarchar(100)
with encryption
as
-- If there's an ID then update the record
if @somethingId <> -1 begin
UPDATE something SET somethingName = @somethingName
end else begin
-- Add a new record
INSERT INTO something ( somethingName ) VALUES ( @somethingName )
end
go
Все они созданы как зашифрованные хранимые процедуры.Столбец id (например, SomeId в этом примере) - это IDENTITY (1,1) с ПЕРВИЧНЫМ КЛЮЧОМ на нем, и в этих таблицах много строк.
При восстановлении на экземпляр SQL 2008 многомоей базы данных, кажется, работает нормально, но вызовы типа
exec usp_add_something @somethingId = -1, @somethingName = 'A Name'
приводят к ошибке, подобной этой:
Violation of PRIMARY KEY constraint 'Something_PK'. Cannot insert duplicate key in object 'dbo.something'.
Кажется, что-то запутаноэто либо приводит к тому, что SQL Server неправильно распределяет следующую IDENTITY ... или что-то в этом роде.Это очень странно!
Я могу вставлять в таблицу напрямую, не указывая столбец идентификатора, и он прекрасно выделяет идентификатор для столбца идентификаторов.
Нет записей с someId= -1 ... не то, чтобы это имело какое-либо значение.
Если я уроню и заново создам процедуру, проблема исчезнет.Но у меня есть много таких процедур, поэтому я не хочу этого делать в случае, если я пропущу некоторые или в базе данных будет настроенная процедура, которую я перезаписываю.
Кто-нибудь знает какие-либо известные проблемы, связанные сэтот?(и решение в идеале!)
Есть ли другой способ перенести мою базу данных sql 2000 в экземпляр sql 2008?Например, возможно ли, что Detach и Attach будут вести себя по-разному?
Я попытался перекомпилировать процедуру, используя sp_recompile 'usp_add_something', но это не решило проблему, поэтому я не могу просто вызвать это во всех процедурах
спасибо за любую помощь
R
(кросс-пост здесь )