Ror*_*ory 4 sql-server sql-server-2000 sql-server-2008
我刚刚将数据库从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
Run Code Online (Sandbox Code Playgroud)
这些都是作为ENCRYPTED存储过程创建的.id列(例如本例中的somethingId)是一个IDENTITY(1,1),上面有一个PRIMARY KEY,这些表中有很多行.
恢复到SQL 2008实例后,很多我的数据库似乎工作正常,但调用如
exec usp_add_something @somethingId = -1, @somethingName = 'A Name'
Run Code Online (Sandbox Code Playgroud)
导致如下错误:
Violation of PRIMARY KEY constraint 'Something_PK'. Cannot insert duplicate key in object 'dbo.something'.
似乎有些事情搞砸了导致SQL Server无法正确分配下一个IDENTITY ......或类似的东西.这很奇怪!
我可以直接INSERT到表中而不指定id列,它为标识列分配一个id就好了.
没有记录有somethingId = -1 ......不应该有任何区别.
如果我放弃并重新创建该过程,问题就会消失.但是我有很多这样的程序,所以如果我错过了一些或者在我覆盖的数据库中有一个自定义过程,那么我真的不想这样做.
有谁知道与此有关的任何已知问题?(理想的解决方案!)
有没有不同的方法我应该将我的sql 2000数据库移动到sql 2008实例?例如,Detach和Attach可能会有不同的行为吗?
我已经尝试使用sp_recompile'usp_add_something'重新编译该过程,但这并没有解决问题,所以我不能简单地在所有过程中调用它.
谢谢你的帮助
[R
(在这里交叉发布)
如果问题是未正确设置的标识种子,则可以通过以下方式重置表:
DBCC CHECKIDENT (TableName, RESEED, 0);
DBCC CHECKIDENT (TableName, RESEED);
Run Code Online (Sandbox Code Playgroud)
这将自动在表中找到最高值并相应地设置种子,这样您就不必进行SELECT Max()
查询.现在修复表可以在自动化中完成,无需动态SQL或手动编写脚本.
但是你说你可以直接插入表中而没有问题,所以它可能不是问题.但我想发布关于重置身份种子的简单方法的记录.
注意:如果您的表格增量为负数,或者您过去重置种子以消耗所有正数后从最低点开始的所有负数,则所有投注均已关闭.特别是在后一种情况下(具有正的增量,但您使用的标识值较低的比别人已经在表中),那么你不想跑DBCC CHECKIDENT
不指定NORESEED
过.因为只会DBCC CHECKIDENT (TableName);
搞砸你的身份价值.你必须使用DBCC CHECKIDENT (TableName, NORESEED)
.如果你忘记这一点,将会有趣的时间.:)
归档时间: |
|
查看次数: |
4627 次 |
最近记录: |