zoukankan      html  css  js  c++  java
  • 【转】SQL SERVER函数无法执行对数据库的修改语句

    当在函数中使用INSERT语句时出现以下错误:
    消息 443,级别 16,状态 15,过程 MyTestFunction,第 9 行
    在函数内的 'INSERT' 中对带副作用的或依赖于时间的运算符的使用无效。


    原因如下:
    自定义函数和存储过程的定位是不一样的,自定义函数主要用于数据的计算,只能控制函数内部定义的局部变量,包括游标和表,都必须在函数内部定义才能使用,对外部数据库作出的任何永久性修改,都是禁止的。
    具体来说,不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。


    允许的操作也不少的,具体包含以下这些:
    => DECLARE 语句,该语句可用于定义函数局部的数据变量和游标。
    => 为函数局部对象的赋值,如使用 SET 为标量和表局部变量赋值。
    => 游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。不允许使用 FETCH 语句将数据返回到客户端。仅允许使用 FETCH 语句通过 INTO 子句给局部变量赋值。
    => 除 TRY...CATCH 语句之外的控制流语句。
    => SELECT 语句,该语句包含具有为函数的局部变量赋值的表达式的选择列表。
    => INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部表变量。
    => EXECUTE 语句,该语句调用扩展存储过程。


    需要注意的是,系统函数中,有两个常用的,是不可以在函数中使用的,分别是newid和rand。
    其实,如果又要执行以上限制的操作,又要返回值,自定义函数不是唯一的选择,可以在存储过程中增加OUTPUT参数,可以实现同样的效果。

    源地址:http://home.51.com/wandrew/diary/item/10034456.html

  • 相关阅读:
    个人工作总结6
    使用java对文件批量重命名
    导入csv文件到数据库
    关于微信小程序的Request请求错误处理
    基于jPlayer的三分屏制作
    条件查询时,如果有的输入框不输入,后台应该怎么处理?
    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
    C++&&Objective-c
    加载ttf字体
    ios6去除高光效果,和判断iphone或ipad设备
  • 原文地址:https://www.cnblogs.com/xwgli/p/3419251.html
Copyright © 2011-2022 走看看