Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.018 c
1-82222
Armaniak
2003-09-12 09:00
2003.09.25
Не выделяется по умолчанию фокус на Итеме TRadioGroup


1-82259
Zeus
2003-09-15 13:12
2003.09.25
DELPHI + WORD


4-82546
DelBoy
2003-07-22 22:46
2003.09.25
Получить Хендл предыдущего окна


14-82474
Baklan
2003-09-09 11:23
2003.09.25
Туплю


3-82125
Alex_x
2003-09-04 11:29
2003.09.25
После отлавливания ошибки в запросе ADO глючит




   Наверх