![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
аналог gen_id в Interbase для MSSQL [D5, MSSQL]
kostik78ua © (2003-09-04 11:50:00)
Добрый день, мастера!
Как написать аналог 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 таблицы :(
Такие извращения мне нужны для совместимости с другими СУБД.
Vuk (2003-09-04 14:31:00) [1]
Да, еще. В KeyGenerator kg_TableName - PK
Vuk (2003-09-04 14:29:00) [2]
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
Nikolay M. (2003-09-04 14:11:00) [3]
Посмотри статью на rsdn о переносе приложений.
По-моему, Статьи-MIDAS-Перенос приложений.
sniknik (2003-09-04 12:14:00) [4]
нет gen_id в MSSQL есть тип, CREATE TABLE (Field int IDENTITY(1,1),.....
MOA (2003-09-04 12:12:00) [5]
При данном подходе могут быть большие заморочки, если одновременно больше 2-х клиентов пытаются получить значение генератора - нечто вроде SELECT MAX(VALUE_ID)+1... должно же быть -> необходимо объявлять транзакцию или лочить таблицу -> приличные тормоза. Можно попробовать объявить в вспомогательной таблице поле IDENTITY - правда, с шагом будут проблемы, но для уникальности достаточно.
А почему бы не делать всё в триггере или процедуре? Тогда при переходе на IB Вам нужно будет только поменять текст триггера/процедуры. Тем более что, IMHO, совместимости, даже "минимальной" Вы всё равно не добьётесь, если проект "серъёзный" - на язык процедур стандарта нет, да и сами языки здорово разные.
Удачи!