Использование хранимых процедур приводит к обновлению - PullRequest
1 голос
/ 09 апреля 2009

У меня есть таблица с двумя столбцами (среди прочих): id и creation_in_variant и хранимая процедура, которая вычисляет значение create_in_variant на основе идентификатора. Я хотел бы сделать что-то вроде этого:

UPDATE [dbo].[alerts]
     SET [created_in_variant] = find_root [id]

Есть ли хороший способ сделать это?

Ответы [ 9 ]

3 голосов
/ 09 апреля 2009

Возможно, вы захотите использовать скалярную функцию (также известную как пользовательскую функцию ) вместо хранимой процедуры для этого типа проблемы.

РЕДАКТИРОВАТЬ : Вот некоторая информация о SVF: Нажмите

РЕДАКТИРОВАТЬ 2 : Вот еще немного информации от 15 секунд

1 голос
/ 09 апреля 2009

Если вы вынуждены использовать хранимую процедуру для реализации того, что вы просили, вы можете просто сохранить найденное корневое значение в переменной и передать его. Существует нет более простого способа, если вы не используете UDF (пользовательскую функцию), как уже упоминали другие.

Это один из самых простых ответов при использовании хранимой процедуры , поскольку нельзя напрямую передать хранимую процедуру в оператор UPDATE. Нет такой интерполяции, как в других языках, таких как C # или Java.

declare @root int
-- 1) Return the root through output parameter
exec find_root @id, @root out
-- or make the sproc to return the root value
exec @root = find_root @id
UPDATE [dbo].[alerts]
     SET [created_in_variant] = @root
1 голос
/ 09 апреля 2009

Измените ваш процесс на UDF, и вы в основном будете называть его точно так, как получили

UPDATE [dbo].[alerts]
     SET [created_in_variant] = dbo.find_root([id])
0 голосов
/ 26 октября 2010

Вы просто скучаете по dbo. Ответ диджея уже будет хорошим. У меня была та же самая проблема сегодня.

0 голосов
/ 09 апреля 2009

Вы можете перепрограммировать хранимую процедуру в пользовательскую функцию и использовать ее.

0 голосов
/ 09 апреля 2009

Я так не думаю. Если бы вы превратили хранимую процедуру в функцию масштабирования, которая бы работала.

Если вы хотите использовать хранимую процедуру, вы должны вызвать хранимую процедуру для каждого идентификатора (в курсоре) и вернуть значение в переменной OUTPUT, а затем выполнить обновление для каждого идентификатора с выходной переменной. Тем не менее, было бы гораздо лучше использовать UDF.

0 голосов
/ 09 апреля 2009

Вы можете использовать UDF вместо хранимой процедуры.

0 голосов
/ 09 апреля 2009

Можете ли вы сделать созданный_инвариант вычисляемым полем?

0 голосов
/ 09 апреля 2009

Переписать хранимую процедуру как скалярную функцию. Тогда вы можете использовать это для вашего обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...