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

  • 相关阅读:
    ci上传图片
    Mac下使用svn命令
    linux 下svn忽略文件
    thinkphp5 隐藏入口和支持pathinfo
    ci tp重定向
    php命名空间
    thinkphp5学习记录一
    Mac下安装homebrew
    使用iTerm2快捷连接SSH
    摄影基础
  • 原文地址:https://www.cnblogs.com/xwgli/p/3419251.html
Copyright © 2011-2022 走看看