Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CHECKIDENT MSSQL 2012  [new]
zindur
Member

Откуда:
Сообщений: 86
Данная команда CHECKIDENT с RESEED-ом работает нормально на MSSQL 2008R2
а вот на MS SQL 2012
выдаёт:

Msg 2627, Level 14, State 1, Line 30
Violation of PRIMARY KEY constraint 'PK_SeedId'. Cannot insert duplicate key in object 'dbo.TMP_Table'. The duplicate key value is (0)
.


ктонибуть встречался с этим?
Спасиба :)

--this works in 2008 but not 2012
IF OBJECT_ID('dbo.TMP_Table') IS NOT NULL
  DROP TABLE dbo.TMP_Table
CREATE TABLE dbo.TMP_Table
(
    SeedId           int           IDENTITY,
    Col1              nvarchar(25)   NOT NULL,
    CONSTRAINT [PK_SeedId]
    PRIMARY KEY CLUSTERED (SeedId)
)

SET IDENTITY_INSERT [dbo].[TMP_Table] ON

IF NOT EXISTS (SELECT * FROM [dbo].[TMP_Table] WHERE SeedId = -1)  
	INSERT [dbo].[TMP_Table] (SeedId, Col1)
	VALUES (-1, 'Unknown')
IF NOT EXISTS (SELECT * FROM [dbo].[TMP_Table] WHERE SeedId = 0)  
	INSERT [dbo].[TMP_Table] (SeedId, Col1)
	VALUES (0, 'System')
	
SET IDENTITY_INSERT [dbo].[TMP_Table] OFF

select * from TMP_Table

DBCC CHECKIDENT('TMP_Table','RESEED', 0)


	INSERT [dbo].[TMP_Table] (Col1)	VALUES ('TMP_TableId1')
	INSERT [dbo].[TMP_Table] (Col1)	VALUES ('TMP_TableId2')	
	
select * from TMP_Table
7 ноя 13, 20:49    [15093739]     Ответить | Цитировать Сообщить модератору
 Re: CHECKIDENT MSSQL 2012  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
zindur,

А что удивительного?
Сначала Вы явно вставили в SeedId значение 0,
а потом пытаетесь вставить ещё один 0 неявно.
PK не может содержать дубликатов.
7 ноя 13, 21:15    [15093848]     Ответить | Цитировать Сообщить модератору
 Re: CHECKIDENT MSSQL 2012  [new]
zindur
Member

Откуда:
Сообщений: 86
велосипед не мой :) ошибка вылезла при переходе на 2012

первое что приходит в голову переписать все скрипты с
автор
Мах(new_reseed_value) + 1 from table

ето и так ясно просто очень много скриптов.

значит ето глюк 2008R2 :) и он просто тупо прощал :)
7 ноя 13, 21:28    [15093903]     Ответить | Цитировать Сообщить модератору
 Re: CHECKIDENT MSSQL 2012  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
IDENTITY with reseed behavior change in SQL 2012
7 ноя 13, 21:36    [15093931]     Ответить | Цитировать Сообщить модератору
 Re: CHECKIDENT MSSQL 2012  [new]
zindur
Member

Откуда:
Сообщений: 86
один и тотже код но с разными результатами если в таблице уже есть данные и делаем рессед.
извините за код скопилпастиладжустастил :)

и вот получаем что на 2008 идентити будет с 1 а на 2012 с нулеа 0, хотя ресеед на обоих = 0

CREATE TABLE [TMP_TBL](
	[MyIdentityCol] [int] IDENTITY(1,1) NOT NULL,
	[ColN1] varchar (50) NULL
 CONSTRAINT [PK_MyIdentityCol_kkk] PRIMARY KEY CLUSTERED ([MyIdentityCol] ASC
)) ON [PRIMARY]

-- Insert Defaults
SET IDENTITY_INSERT [TMP_TBL] ON
INSERT INTO [TMP_TBL] (MyIdentityCol,ColN1)  VALUES ( -1,'123')
SET IDENTITY_INSERT [TMP_TBL] OFF

SELECT * FROM [TMP_TBL]

declare @schemaName char(100) = 'dbo', @tableName char(100) = 'TMP_TBL', @identityColumn char(100) = 'MyIdentityCol';
declare @id int, @strSQL nvarchar(max);

   -- Reseedem :)
   set @strSQL = 'select @id = case when max(' + RTRIM(@identityColumn) + ') < 0 then 0 else isnull(max(' + RTRIM(@identityColumn) + '),-1)+1 end from [' + RTRIM(@schemaName) +'].[' + RTRIM(@tableName) +']'
   SELECT @strSQL
   EXEC SP_EXECUTESQL @strSQL, N'@id int OUTPUT', @id OUTPUT
   SELECT @id AS 'Reseed Value'
   set @strSQL = 'DBCC CHECKIDENT ("[' + RTRIM(@schemaName) +'].[' + RTRIM(@tableName) +']" , RESEED, ' + cast(@id as varchar) + ')'
   EXEC SP_EXECUTESQL @strSQL

-- insertim
INSERT INTO [TMP_TBL] (ColN1) VALUES ('123')

-- Tada ta da :)
SELECT * FROM [TMP_TBL]

DROP TABLE [TMP_TBL]


MSSQL 2008R2
MyIdentityCol	ColN1
-1	123
1	123


MSSQL 2012
MyIdentityCol	ColN1
-1	123
0	123
21 ноя 13, 15:47    [15169151]     Ответить | Цитировать Сообщить модератору
 Re: CHECKIDENT MSSQL 2012  [new]
zindur
Member

Откуда:
Сообщений: 86
прочитал внимательнее ivm линк - тоже самое что и я запостил :| - извиняюсь :)
- щас чешу реку как сделать чтоб на обоих серверах было одно и тоже
21 ноя 13, 16:05    [15169332]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить