Функция - генератор ключа

kva
Дата: 11.12.2002 15:23:52
На MSSQL 2000 пытаюсь создать функцию, которая по заданному имени таблицы инкрементировала бы в таблице LastId поле LastId ( извините за совпадение, не от меня зависит) и затем возвращало бы его значение.
Иначе говоря, генератор ключа в виде функции.

CREATE FUNCTION GetId (@TName char(20)) RETURNS char(8)
AS
BEGIN
DECLARE @LastId char (8)

UPDATE dbo.LastID SET dbo.LastID.LastID = dbo.LastID.LastID + 1
WHERE TNAME = @TNAME

SELECT @LastID = RIGHT('00000000' + RTrim(Convert(varchar, LastID)), 8)
FROM LastID WHERE TNAME = @TNAME

RETURN @LastId
END

Пишет, что Invalid use of 'UPDATE' within a function.
Аналогичная процедура работает, но мне надо именно функцию.
Как можно сделать?
Заранее спасибо, Владимир
tygra
Дата: 11.12.2002 15:28:13
Нельзя в функции делать изменения данных :(((
VVG_
Дата: 11.12.2002 15:31:23
Можно сделать multistatement table valued function, которая обновляет и возвращает табличку из одного значения. К ней присобачить scalar valued function, которая делает select из первой функции и возвращяет значение ключа.
VVG_
Дата: 11.12.2002 15:37:55
Только чуть подправить функцию надо, вместо двух операторов сделать один

UPDATE dbo.LastID SET @LastID = dbo.LastID.LastID = dbo.LastID.LastID + 1

WHERE TNAME = @TNAME

Иначе потом геморройчик можно поиметь небольшой. Ну и плюс разруливание int-varchar добавить.
Jimmy
Дата: 11.12.2002 15:52:58
Вопрос академический:
А что, IDENTITY уже не актуально?
alexeyvg
Дата: 11.12.2002 16:02:36
2VVG_
А вот меня впечатлило "WHERE TNAME = @TNAME"
:-)
funikovyuri
Дата: 11.12.2002 16:03:03
Или newid()
kva
Дата: 11.12.2002 16:08:57
2VVG_
Есть вопрос. Будут ли при этом скалярная функция выполняться как единая транзакция?
2Jimmy
Нельзя ли поподробнее для новичка по поводу IDENTITY? Набросок кода, плиз.
VVG_
Дата: 11.12.2002 16:14:24
2alexeyvg

Что, Вам никогда в наследство работающую систему не оставляли?

Идентити не дружит с репликацией, GUID нечитабелен (спросите как-нибудь клиента по телефону GUID-номер заказа :), так что все имеют право добавить что-то свое. Не боги горшки обжигают все-таки.

А то, что не ObjectID, а TableName тоже можно понять.
VVG_
Дата: 11.12.2002 16:16:46
А какая разница, гораздо важнее, чтобы update и select были в одной транзакции, для чего собственно я и предлагаю их объединить.