循环中的MS SQL更新

时间:2009-06-09 14:38:17

标签: sql-server sql-server-2005 tsql

我试图意识到这样的事情:

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 个答案:

答案 0 :(得分:6)

为什么将游标用于basicaly是一个简单的set操作?

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

进一步回答您的问题,您可以在DECLARE CURSOR语句中添加FOR UPDATE [OF column_name,...]。如果省略[OF column name,...],则所有列都可以更新。

答案 1 :(得分:1)

您是将其创建为存储过程:

创建程序?或者作为CREATE FUNCTION ??

您必须使用CREATE PROCEDURE来允许这种程序逻辑。

对不必要的光标注释+1。

答案 2 :(得分:0)

当您打算构建存储过程时,听起来好像是将其构建为用户定义函数。

答案 3 :(得分:0)

SQL Server中的用户定义函数无法更改数据库状态。您必须使用存储过程;如果需要返回值,请使用OUTPUT参数。