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

Откуда: Империя Добра
Сообщений: 37010
подскажите плиз как правильно имитировать сиквенс в 2008 версии
нужно сделать так что бы одновременно у нескольких таблиц были уникальные айдишники
7 фев 13, 16:55    [13892634]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
iap
Member

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

может, тогда для PK сгодится UNIQUEIDENTIFIER?
DEFAULT(NEWID()) и т.д. и т.п.
7 фев 13, 16:58    [13892661]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33930
Блог
или сделать общую таблицу уникальных id
7 фев 13, 16:59    [13892671]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
http://www.google.com/search?q=supertype+subtype
7 фев 13, 17:08    [13892757]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37010
iap
Wizandr,

может, тогда для PK сгодится UNIQUEIDENTIFIER?
DEFAULT(NEWID()) и т.д. и т.п.


важно что бы это был integer
7 фев 13, 17:09    [13892770]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37010
Критик
или сделать общую таблицу уникальных id

придется так и сделать
а потом что-то типа
	INSERT INTO dbo.GlobalDocs(...) VALUES(...) 
SET @ID = SCOPE_IDENTITY();
INSERT INTO dbo.MyDoc(ID,...) VALUES(@DocID, ....) 
7 фев 13, 17:41    [13893021]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Wizandr
Критик
или сделать общую таблицу уникальных id

придется так и сделать
а потом что-то типа
	INSERT INTO dbo.GlobalDocs(...) VALUES(...) 
SET @ID = SCOPE_IDENTITY();
INSERT INTO dbo.MyDoc(ID,...) VALUES(@DocID, ....) 
у меня аналогично сделано достаточно давно. работает стабильно
7 фев 13, 17:43    [13893042]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Wizandr
подскажите плиз как правильно имитировать сиквенс в 2008 версии
нужно сделать так что бы одновременно у нескольких таблиц были уникальные айдишники

ну вот я недавно так делал
select
newID=
ROW_NUMBER() over(order by (select 1))+
				IDENT_CURRENT('table') -case when IDENT_CURRENT('table')=IDENT_SEED('table') then
               case when exists(select 1 from table) then 0
               else 1 end
            else 0 end
into #tempTable

--а потом можно с сортировкой
insert into table(id)
select newID
from #tempTable
order by newID
-- а можно SET IDENTITY_INSERT on 
-- и сделать вставку


а еще можно так попробовать, хотя я еще и не пробовал
7 фев 13, 17:45    [13893047]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37010
спасибо за ответы
думаю еще можно в тригер before insert завернуть
7 фев 13, 17:47    [13893070]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Wizandr
Критик
или сделать общую таблицу уникальных id

придется так и сделать
а потом что-то типа
	INSERT INTO dbo.GlobalDocs(...) VALUES(...) 
SET @ID = SCOPE_IDENTITY();
INSERT INTO dbo.MyDoc(ID,...) VALUES(@DocID, ....) 

А вы в эти таблицы всегда по одной записи вставляете?

Wizandr
тригер before insert

Угу, только его не существует в MSSQL...
7 фев 13, 17:51    [13893109]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Мистер Хенки
ну вот я недавно так делал
select
newID=
ROW_NUMBER() over(order by (select 1))+
				IDENT_CURRENT('table') -case when IDENT_CURRENT('table')=IDENT_SEED('table') then
               case when exists(select 1 from table) then 0
               else 1 end
            else 0 end
into #tempTable

--а потом можно с сортировкой
insert into table(id)
select newID
from #tempTable
order by newID
-- а можно SET IDENTITY_INSERT on 
-- и сделать вставку

А как вы разруливаете конфликты при параллельной вставке из разных коннекций?
7 фев 13, 17:55    [13893145]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Гость333
Мистер Хенки
ну вот я недавно так делал
select
newID=
ROW_NUMBER() over(order by (select 1))+
				IDENT_CURRENT('table') -case when IDENT_CURRENT('table')=IDENT_SEED('table') then
               case when exists(select 1 from table) then 0
               else 1 end
            else 0 end
into #tempTable

--а потом можно с сортировкой
insert into table(id)
select newID
from #tempTable
order by newID
-- а можно SET IDENTITY_INSERT on 
-- и сделать вставку

А как вы разруливаете конфликты при параллельной вставке из разных коннекций?

да у меня задача была на одну коннекцию. Это с конвертации данных с одной системы в другую. А с параллелными вставками конечно сложнее будет
7 фев 13, 17:58    [13893167]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37010
Гость333
А вы в эти таблицы всегда по одной записи вставляете?

Wizandr
тригер before insert

Угу, только его не существует в MSSQL...


да. вставлять всегда по одно записи

я имел ввиду INSTEAD OF INSERT тригер
7 фев 13, 18:01    [13893185]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Wizandr
да. вставлять всегда по одно записи

Ну тогда да, SCOPE_IDENTITY из общей таблицы id'ов — вроде бы самый простой способ.

Видел реализацию подобной задачи с такими нюансами:
— таблица одна;
— вставка всегда по одной записи;
— если выполняются некие условия, то хотим, чтобы id был чётный, а иначе — чтобы нечётный. При этом между этими id'ами может быть любой перекос, например 100 чётных id'ов от 2 до 200 и миллион нечётных от 1 до 2000001;
— есть две таблицы для генерации сиквенсов, одна с identity(1,2), а вторая — с identity(2,2).
Как-то так
Всё работает как и было задумано. Такая вот странная задумка.
7 фев 13, 18:22    [13893299]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1432
Можно сделать у каждой таблицы свой сид, отличающийся на единицу, и одинаковый шаг, тогда во всех таблицах точно будут уникальные идентификаторы.
7 фев 13, 18:25    [13893322]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Генераторы в MSSQL

Организация пользовательских счетчиков (генераторов) в Microsoft SQL Server
7 фев 13, 21:31    [13893950]     Ответить | Цитировать Сообщить модератору
 Re: sequence в sql server 2008  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Wizandr
нужно сделать так что бы одновременно у нескольких таблиц были уникальные айдишники
Самое простое - разделить по диапазонам или по последней цифре.
7 фев 13, 22:21    [13894068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить