[TSQL] Как правильно написать хранимую процедуру ...

bastii

Пусть есть таблица со столбцами: ID, Name, где ID осн ключ с автоинкрементом. Нужно написать хранимую процедуру, которая по заданному имени создает запись в таблице и возвращает ID созданной записи (если записи с заданным именем нет). Если запись с этим именем есть уже есть, то просто возвращает ID этой записи.
Если делать SELECT, потом INSERT, то есть вероятность, что между ними кто-то другой сделает INSERT.
Вопрос собственно, как вообще такие ситуации обслуживают. Может решение нужно искать вне этой процедуры?
Короче нужны советы

otvertka07

чуви, ты вообще слышал о транзакциях?

bastii

ну просвети, как это будет выглядить (работать) в моем случае
вот что пока родил
IMHO уродство, помогите хоть нормально переписать

ALTER PROCEDURE dbo.AddRootDir
(
@Path nvarchar(50
@ID bigint OUTPUT
)
AS
SET @ID = (SELECT ID FROM dbo.Directories WHERE Path = @Path)
IF @ID IS NOT NULL RETURN

INSERT dbo.Directories (Path) VALUES (@Path)
SET @ID = (SELECT ID FROM dbo.Directories WHERE Path = @Path)

RETURN

Marinavo_0507

Отцы говорят, что SQL устарел, и все должны использовать XQuery, так что юзай сразу его.
ID - у тебя auto_increment что ли?
Ну тогда последний запрос наверняка можно проще сделать,
должен быть аналог last_insert_id какой-нибудь.

bastii

> должен быть аналог last_insert_id какой-нибудь
А какой?

bastii

т.е. так?

ALTER PROCEDURE dbo.AddRootDir
(
@Path nvarchar(50
@ID bigint OUTPUT
)
AS
SET @ID = (SELECT ID FROM dbo.Directories WHERE Path = @Path)
IF @ID IS NOT NULL RETURN

INSERT dbo.Directories (Path) VALUES (@Path)
@ID = @@IDENTITY
Уже лучше Что можно с этим сделать дальше (в смысле улучшить)?

bastii

А каким боком мне тут транзакции помогут?

bastii

Может локи?

Anna04

Если бы я знал, что такое TSQL, возможно, и написал бы процедуру..
Сам юзал только pl/pgSQL, pl/SQL.
1) Хранимая процедура образует транзакцию. Я не знаю, допустимы ли в TSQL вложенные (nested) транзакции, если нет - транзакцию инициирует запуск самой внешней процедуры.
2) Функции, возвращающие последнее считанное значение типа LAST_INSERT_ID возвращают значение для данного потока. То есть, в других потоках и процессах может происходить любая хня, тебе вернут то что надо.
Такие дела, брат
Оставить комментарий
Имя или ник:
Комментарий: