Обновление MS SQL в цикле - PullRequest
0 голосов
/ 09 июня 2009

я пытаюсь реализовать что-то вроде этого:

DECLARE @id int
declare @cont varchar(max)
declare @temp varchar(max)
DECLARE curs CURSOR FOR SELECT id, [content] FROM [dbo].[Contents]

OPEN curs

FETCH NEXT FROM curs into @id, @cont
WHILE @@FETCH_STATUS = 0
   BEGIN
      SET @temp = replace(@cont, @param_ReplaceThis, @param_WithReplacement)

      update [dbo].[Contents]
         set [Content] = @temp
        where id = @id;

      FETCH NEXT FROM curs into @id, @cont;
   END;
CLOSE curs;
DEALLOCATE curs;

но я всегда получаю сообщение об ошибке, согласно которому нельзя использовать 'UPDATE' внутри функции ... я только, что этот материал работает нормально в Oracle ...

Ответы [ 4 ]

6 голосов
/ 09 июня 2009

Зачем использовать курсор для чего-то, что по сути является простой операцией над множествами?

UPDATE [dbo].[Contents] 
SET [Content] = replace([Content], @param_ReplaceThis, @param_WithReplacement)

Отвечая на ваш вопрос дальше, вы можете добавить FOR UPDATE [OF column_name, ...] к вашему заявлению DECLARE CURSOR. Если вы опустите [OF имя столбца, ...], все столбцы будут обновляться.

1 голос
/ 09 июня 2009

Вы создаете его как хранимую процедуру:

СОЗДАТЬ ПРОЦЕДУРУ ?? или как СОЗДАТЬ ФУНКЦИЮ ??

Вы должны использовать CREATE PROCEDURE, чтобы разрешить подобный процедурный процесс.

И +1 к ненужному комментарию курсора.

0 голосов
/ 09 июня 2009

Пользовательские функции в SQL Server не могут изменять состояние базы данных. Вы должны использовать хранимую процедуру; если вам нужно вернуть значение, используйте параметр OUTPUT.

0 голосов
/ 09 июня 2009

Звучит так, будто вы строите это как пользовательскую функцию, когда вы хотите создать хранимую процедуру.

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