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

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

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

    cuiyi's blog(崔毅 crazycy)

    記錄點滴 鑒往事之得失 以資于發(fā)展
    數(shù)據(jù)加載中……

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

    寫函數(shù)的時候遇到了這樣的問題
    使用
    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

    原來,在函數(shù)中使用DML還真不能太隨意,SELECT可以;UPDATE/DELTE/INSERT還真不可以。
    網(wǎng)上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 閱讀(2992) 評論(0)  編輯  收藏 所屬分類: DBMS

    主站蜘蛛池模板: 丁香花免费高清视频完整版| 国产精品视频永久免费播放| 亚洲国产成人片在线观看| 免费精品99久久国产综合精品| 亚洲色图国产精品| 在线jlzzjlzz免费播放| 中文字幕一区二区免费| 亚洲国产美女福利直播秀一区二区 | 亚洲高清中文字幕免费| 狠狠热精品免费观看| 亚洲AV日韩AV永久无码绿巨人| 免费看美女让人桶尿口| 国产麻豆一精品一AV一免费| 国产成人亚洲综合一区| 亚洲人成图片小说网站| 最近最新MV在线观看免费高清| 一级毛片a免费播放王色| 67pao强力打造67194在线午夜亚洲| 国产精品久免费的黄网站| 久久免费观看国产精品88av| 亚洲精品无码久久久久牙蜜区| 亚洲av永久无码精品古装片 | 久久午夜无码免费| 国产亚洲精品美女| 亚洲一区无码中文字幕乱码| 亚洲线精品一区二区三区| 免费观看的av毛片的网站| 免费无码VA一区二区三区| 黄色三级三级三级免费看| 亚洲人成人网毛片在线播放| 亚洲人成网7777777国产| 免费大黄网站在线看| 成人免费一区二区无码视频| 久热免费在线视频| 一区二区三区在线免费观看视频| 最新亚洲卡一卡二卡三新区| 亚洲国产精品免费视频| 国产国拍精品亚洲AV片| 亚洲AⅤ优女AV综合久久久| 成年人性生活免费视频| 59pao成国产成视频永久免费|