[TSQL] Как правильно написать хранимую процедуру ...
чуви, ты вообще слышал о транзакциях? 

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

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