<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 閱讀(2971) 評論(0)  編輯  收藏 所屬分類: DBMS

    主站蜘蛛池模板: 无码的免费不卡毛片视频| 亚洲中文字幕久久精品无码2021| 亚洲AV综合永久无码精品天堂| 亚洲一区免费视频| 亚洲成a人片在线观看中文app| 99无码人妻一区二区三区免费| 亚洲精品福利在线观看| 性xxxxx免费视频播放| 亚洲日本天堂在线| 免费很黄很色裸乳在线观看| 一级做a爰片久久毛片免费看| 国产美女亚洲精品久久久综合| 国产在线一区二区综合免费视频| 亚洲av无码乱码国产精品| 69精品免费视频| 亚洲Av永久无码精品黑人| 亚洲成AV人网址| 在线成人精品国产区免费| 久久精品蜜芽亚洲国产AV| 在人线av无码免费高潮喷水| 久久无码av亚洲精品色午夜| 亚洲人成中文字幕在线观看| 99精品热线在线观看免费视频| 亚洲AV成人一区二区三区在线看| 国产精品冒白浆免费视频| 国产一二三四区乱码免费| 精品无码一区二区三区亚洲桃色| 成人免费a级毛片无码网站入口 | 久久不见久久见中文字幕免费 | 美女免费精品高清毛片在线视| 亚洲国产精品自在拍在线播放| 久久精品国产这里是免费| 久久精品国产亚洲av麻豆图片| 免费播放春色aⅴ视频| 无码午夜成人1000部免费视频| 亚洲乱码在线卡一卡二卡新区| 免费a级毛片在线观看| 久久免费动漫品精老司机| 亚洲欧美成人综合久久久| 亚洲香蕉成人AV网站在线观看| 丁香花免费高清视频完整版|