<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    cuiyi's blog(崔毅 crazycy)

    記錄點滴 鑒往事之得失 以資于發展
    數據加載中……

    sqlserver: Invalid use of a side-effecting operator within a function (Print/Raiserror)

    寫函數的時候遇到了這樣的問題
    使用
    raiserror('enter this line', 16, -1) with log
    print('enter this line')

    分別遇到了
    Invalid use of a side-effecting operator 'Print' within a function
    Invalid use of a side-effecting operator 'Raiserror' within a function

    原來,在函數中使用DML還真不能太隨意,SELECT可以;UPDATE/DELTE/INSERT還真不可以。
    網上google了下,還真是不少類似的案例
    1. Functions are used to return data: scalar-value or table-value.
    2. 
    Invalid use of side-effecting or time-dependent operator in ‘newid’ within a function.
    It states that the use of side-effecting and time-dependent operators is not allowed within a function. 


    Side-Effecting Operators
    A side-effecting operator is basically what it says.  
    It is an operator that affects anything outside the function.  
    This could be seen when trying to create an object or insert or update a table.  

    Functions should be self-contained.  
    They can use data from the database, but should not affect data in the database.  
    In other words, functions should be read-only.

    There is a list of side-effecting operators, which include INSERT, CREATE, UPDATE, OPEN, CLOSE, DELETE, SELECT … INTO, and more.  
    You cannot use these inside a function.  
    If you do, you will receive a slightly different message.  The message will not mention time-dependent operators.  It will look like this.
    Msg 443, Level 16, State 15, Procedure FN_TEST, Line 9
    Invalid use of a side-effecting operator ‘INSERT’ within a function. 

    To get around some of the side-effecting operator rules shown by Msg 443, we can use a table variable.  
    Below is an example on a table valued function.  It returns a table variable.  
    In the function we insert, update, and delete from the table variable.  
    You cannot create a temp table, but table variables are OK.

    CREATE FUNCTION FN_TEST()
    RETURNS @table TABLE (
     i int,
     j int)
    AS
    BEGIN
     
     INSERT INTO @table
     SELECT 1, 0
     UNION ALL
     SELECT 2, 2
      
     UPDATE @table
     SET j = 1
      
     DELETE @table
     WHERE i = 1
      
     RETURN
      
    END

    If you try this function yourself, you will see that it compiles and executes with no problem. 
    Operators used on table variables are not considered side-effecting operators.

    Time-Dependent Operators
    You will also receive Msg 443 if you use time-dependent operators in a function.  
    Time-dependent operators are those which return a value based on the time.  
    This include, but are not limited to GETDATE(), SYSDATETIME(), NEWID(), and RAND().  
    This is because functions should to return the same value when provided with the same set of inputs.  
    Since these functions return a different value each time, they are not allowed. 
    There is one solution to part of this problem.  If you wish to use a date or an id, you can provide it to the function.  
    You could pass NEWID() or GETDATE() as the value of a parameter sent to the function.  
    If you need to use time-dependent operators multiple times, you can’t use a function.

    posted on 2013-10-25 18:24 crazycy 閱讀(2968) 評論(0)  編輯  收藏 所屬分類: DBMS

    主站蜘蛛池模板: 中文字幕成人免费视频| 亚洲一区二区在线免费观看| 中文字幕免费视频| 成人无码视频97免费| 久久精品国产亚洲AV| 亚洲成人福利网站| 亚洲春色在线视频| 亚洲国产成人精品久久久国产成人一区二区三区综 | 视频免费1区二区三区| 天堂亚洲国产中文在线| 亚洲激情在线观看| 亚洲色中文字幕无码AV| 免费乱码中文字幕网站| 成年在线观看免费人视频草莓| 91麻豆国产免费观看| 精品在线免费观看| 韩国免费A级毛片久久| 日本一区二区在线免费观看 | a一级爱做片免费| 国产成人亚洲综合a∨| 亚洲综合久久精品无码色欲| 亚洲婷婷综合色高清在线| 亚洲欧洲在线观看| 亚洲电影一区二区| 亚洲久本草在线中文字幕| 亚洲成AV人片在线播放无码| 亚洲中文字幕久久精品无码喷水| 亚洲国产人成中文幕一级二级| 又爽又黄无遮挡高清免费视频| 免费久久精品国产片香蕉| 四虎影视永久免费观看网址 | 精品亚洲成A人在线观看青青| 亚洲国产AV一区二区三区四区| 亚洲美国产亚洲AV| 亚洲av永久无码精品网址| 精品韩国亚洲av无码不卡区| 精品国产日韩亚洲一区91| 无码免费又爽又高潮喷水的视频 | 四虎影视免费永久在线观看 | 人妻18毛片a级毛片免费看| 一级人做人爰a全过程免费视频 |