Transact SQL中自定義函式的限制

2021-05-24 12:54:51 字數 1257 閱讀 3135

transact-sql中自定義函式的限制

一直以為自定義函式只是比儲存過程多了乙個返回值而已,沒有想到有這麼多的限制,事情的起源都是因為下面這個簡單的自定義函式引起的:

create function mytestfunction

(@testcontent varchar(20)

)returns varchar(255)

asbegin

insert into mytesttable(column1) values(@testcontent)

return 'asdfasdf'

endgo

當然業務邏輯不可能是這樣的啦,只是舉個例子,但是很簡單的**確報出以下錯誤:

訊息 443,級別 16,狀態 15,過程 mytestfunction,第 9 行

在函式內的 'insert' 中對帶***的或依賴於時間的運算子的使用無效。

我就納悶了,憑啥函式裡面不讓我insert阿,後來又測試了一下,不光是insert,包括update和delete,也都不可以。找了一下msdn,才明白了基本的道理,自定義函式和儲存過程的定位是不一樣的,自定義函式主要用於資料的計算,只能控制函式內部定義的區域性變數,包括游標和表,都必須在函式內部定義才能使用,對外部資料庫作出的任何永久性修改,都是禁止的。

具體來說,不能在函式中執行的操作包括:對資料庫表的修改,對不在函式上的區域性游標進行操作,傳送電子郵件,嘗試修改目錄,以及生成返回至使用者的結果集。

允許的操作也不少的,具體包含以下這些:

=> declare 語句,該語句可用於定義函式區域性的資料變數和游標。

=> 為函式區域性物件的賦值,如使用 set 為標量和表區域性變數賦值。

=> 游標操作,該操作引用在函式中宣告、開啟、關閉和釋放的區域性游標。不允許使用 fetch 語句將資料返回到客戶端。僅允許使用 fetch 語句通過 into 子句給區域性變數賦值。

=> 除 try...catch 語句之外的控制流語句。

=> select 語句,該語句包含具有為函式的區域性變數賦值的表示式的選擇列表。

=> insert、update 和 delete 語句,這些語句修改函式的區域性表變數。

=> execute 語句,該語句呼叫擴充套件儲存過程。

需要注意的是,系統函式中,有兩個常用的,是不可以在函式中使用的,分別是newid和rand。

其實,如果又要執行以上限制的操作,又要返回值,自定義函式不是唯一的選擇,可以在儲存過程中增加output引數,可以實現同樣的效果。

綠色通道:好文要頂關注我收藏該文與我聯絡

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...