Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.25;
Скачать: CL | DM;

Вниз

аналог gen_id в Interbase для MSSQL   Найти похожие ветки 

 
kostik78ua   (2003-09-04 11:50) [0]

Добрый день, мастера!
Как написать аналог gen_id в Interbase для MSSQL?
Для этого создал таблицу GENERATORS (NAME varchar(32), VALUE_ID int)
insert into GENERATORS (NAME, VALUE_ID) values ("GENERATOR1", 1)
И каждый раз, обращаясь к таблице GENERATORS, надо делать inc(VALUE_ID)
Это нужно для SQL-команды типа:
insert into T1 (Field1, Field2)
select gen_id("GENERATOR1", 1) Field1, Field2 from T2
Поэтому через хранимую процедуру не получается (ее в селект не вставишь). А функция не позволяет делать update таблицы :(
Такие извращения мне нужны для совместимости с другими СУБД.


 
MOA ©   (2003-09-04 12:12) [1]

При данном подходе могут быть большие заморочки, если одновременно больше 2-х клиентов пытаются получить значение генератора - нечто вроде SELECT MAX(VALUE_ID)+1... должно же быть -> необходимо объявлять транзакцию или лочить таблицу -> приличные тормоза. Можно попробовать объявить в вспомогательной таблице поле IDENTITY - правда, с шагом будут проблемы, но для уникальности достаточно.
А почему бы не делать всё в триггере или процедуре? Тогда при переходе на IB Вам нужно будет только поменять текст триггера/процедуры. Тем более что, IMHO, совместимости, даже "минимальной" Вы всё равно не добьётесь, если проект "серъёзный" - на язык процедур стандарта нет, да и сами языки здорово разные.
Удачи!


 
sniknik ©   (2003-09-04 12:14) [2]

нет gen_id в MSSQL есть тип, CREATE TABLE (Field int IDENTITY(1,1),.....


 
Nikolay M. ©   (2003-09-04 14:11) [3]

Посмотри статью на rsdn о переносе приложений.
По-моему, Статьи-MIDAS-Перенос приложений.


 
Vuk ©   (2003-09-04 14:29) [4]


CREATE TABLE [dbo].[KeyGenerator] (
[kg_TableName] [sysname] NOT NULL ,
[kg_KeyValue] [int] NOT NULL
)

ALTER procedure dbo.spKG_GetNextValue
@TableName sysname,
@KeyValue int output

as
begin

set nocount on

select @TableName = UPPER(@TableName)

insert into dbo.KeyGenerator
(kg_TableName, kg_KeyValue)
select
@TableName, 0
where
not exists(select 1 from dbo.KeyGenerator where kg_TableName = @TableName)

if @@error <> 0
return -1

update dbo.KeyGenerator
set
@KeyValue = kg_KeyValue = kg_KeyValue + 1
where
kg_TableName = @TableName

return 0
end


 
Vuk ©   (2003-09-04 14:31) [5]

Да, еще. В KeyGenerator kg_TableName - PK



Страницы: 1 вся ветка

Текущий архив: 2003.09.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.047 c
3-82140
Haba
2003-09-03 17:28
2003.09.25
DBGrid, XML и DecimalSeparator


14-82476
Карлсон
2003-09-05 16:23
2003.09.25
рассказ Бредбери?


1-82328
Rustik
2003-09-12 11:41
2003.09.25
Как из реестра достать адрес расоложения шаблона Word


14-82482
TMaster
2003-09-05 22:36
2003.09.25
Вопрос по форуму


14-82459
Ykropsev
2003-09-07 12:49
2003.09.25
Какая прога нужна для воспроизведения флэшек в формате swf ?