Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-82047
BillyJeans
2003-09-02 17:32
2003.09.25
Фильтрация по дате в TDbf...


3-82143
АлеКс
2003-09-04 09:51
2003.09.25
Запрос


3-82160
Akni
2003-09-03 14:45
2003.09.25
Параметры в StoredProc


3-82039
jack128
2003-09-02 19:42
2003.09.25
Порядок проверки условий в запросе


1-82185
Дмитрий
2003-09-15 16:53
2003.09.25
Надстрочные и подстрочные сиволы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский