Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
Внизаналог 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.011 c