[TSQL] Как правильно написать хранимую процедуру ...
чуви, ты вообще слышал о транзакциях?
вот что пока родил
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
ID - у тебя auto_increment что ли?
Ну тогда последний запрос наверняка можно проще сделать,
должен быть аналог last_insert_id какой-нибудь.
А какой?
Уже лучше Что можно с этим сделать дальше (в смысле улучшить)?
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
А каким боком мне тут транзакции помогут?
Может локи?
Сам юзал только pl/pgSQL, pl/SQL.
1) Хранимая процедура образует транзакцию. Я не знаю, допустимы ли в TSQL вложенные (nested) транзакции, если нет - транзакцию инициирует запуск самой внешней процедуры.
2) Функции, возвращающие последнее считанное значение типа LAST_INSERT_ID возвращают значение для данного потока. То есть, в других потоках и процессах может происходить любая хня, тебе вернут то что надо.
Такие дела, брат
Оставить комментарий
bastii
Пусть есть таблица со столбцами: ID, Name, где ID осн ключ с автоинкрементом. Нужно написать хранимую процедуру, которая по заданному имени создает запись в таблице и возвращает ID созданной записи (если записи с заданным именем нет). Если запись с этим именем есть уже есть, то просто возвращает ID этой записи.Если делать SELECT, потом INSERT, то есть вероятность, что между ними кто-то другой сделает INSERT.
Вопрос собственно, как вообще такие ситуации обслуживают. Может решение нужно искать вне этой процедуры?
Короче нужны советы