SQL SERVER 的 CLR錶值函式

2021-08-25 07:10:32 字數 1928 閱讀 5673

一、使用clr錶值函式的背景

在sql server裡面,直接讀取遠端資料庫的表,似乎會占用大量的記憶體,出現類似錯誤:

鏈結伺服器 "192.168.0.1" 的 ole db 訪問介面 "sqlncli10" 報錯。提供程式記憶體不足。 [sqlstate 42000] (錯誤 7399) 。

我不知道讀取遠端資料庫的表是乙個什麼樣的原理,是首先從遠端將該錶一古腦全部載入到本地記憶體,然後再根據過濾條件來獲得相應的記錄,還是這個過濾在遠端伺服器完成,然後返回找到的記錄?

從占用大量記憶體來看,我覺得應該是前者。

如果在遠端資料庫裡面提供乙個函式,獲取什麼記錄,都通過這個函式,這樣返回來的就是少量的記錄,絕大部分的資料處理都已在遠端完成,禦敵於國門之外。

但是遠端資料庫的函式是不能直接使用的,會報「不允許使用遠端錶值函式呼叫。

」的錯誤。儲存過程可以,函式不行。只能通過openquery的方式來完成呼叫。但是,openquery又不能傳遞引數。(詳見

如何給openquery傳遞引數)

變通的辦法是,在本地寫乙個clr的錶值函式,由它負責去訪問遠端函式,而本地訪問它,等於間接訪問遠端函式。

之所以用clr錶值函式,是比較好傳遞引數給openquery,並且獲得返回記錄後,又能夠裝配好返回給本地呼叫方。假如不是函式而是儲存過程,我都不知道呼叫方怎麼去獲取到這些記錄。

二、編寫clr錶值函式

using system; using system.data; using system.data.sqlclient; using system.data.sqltypes; using microsoft.sqlserver.server; using system.collections; using system.collections.generic; public partial class myfunc )');", id); ilistitems = new list(); using (sqlconnection conn = new sqlconnection("context connection = true")) catch foreach (datarow dr in dt.rows) } return items; } //這個方法一定要有,但究竟是什麼時候被呼叫的,沒搞明白 static void fillrow (object obj , out sqlint32 iid , out sqlstring sname , out sqldatetime dcreatedate) else } struct model } }

三、部署clr錶值函式

1、 **編寫完後,編譯成dll。然後開啟sql server的目標資料庫 --》程式集 --》新增程式集,將dll匯入。給該程式集起個名字,比如叫myclrdll

2、如果**更改,重新編譯成dll,可以用以下語句重新匯入

alter assembly [myclrdll]

from 'd:/code/temp/myclrdll.dll'

注意'd:/code/temp/myclrdll.dll'一定是資料庫所在機器的路徑。通常我們程式和資料庫不同機器,所以這個路徑常常搞錯。

3、建立資料庫錶值函式,以使用這個clr錶值函式

use [mydb]

gocreate function [dbo].[cr_func_getdatabyid](@id [int])

returns table (

[id] [int] null,

[name] [nvarchar](300) null,--varchar不行,要用nvarchar

[createdate] [smalldatetime] null

) with execute as caller

as external name [myclrdll].[myfunc].[getdatabyid]

完成,從此您可以幸福地使用函式cr_func_getdatabyid鳥。

Sqlserver錶值函式

實現錶值函式很簡單 下面是乙個不帶輸入引數的錶值函式 createfunctiontvpoints returnstable as return select fromtb users 這個錶值函式數查詢所有使用者表的資料 對於多語句錶值函式,在 begin.end 語句塊中定義的函式體包含一系列 ...

SQL Server 錶值函式

錶值函式還是很有意思的,我現在想實現乙個功能。就是我查詢出來的內容,我要對結果進行再次查詢,也要輸入引數,我想了想 1.儲存過程 不能對執行後的結果進行再次查詢,需要建立臨時表,太麻煩 2.檢視 檢視不能傳入引數啊啊啊啊啊 然後,用了錶值函式,美滋滋 create function dbo wate...

sql server 2005中對CLR的允許設定

在sql server 2005中,可以允許用vs.net 2005來編寫儲存過程了,這比t sql有很大好處,但要注意的是,當要使用sql server 2005這個功能時,在安全性方面會有所降低,因為必須將clr允許除錯選項開啟,因此建議只有當特別複雜的儲存過程時,才用.net語言來編寫,普通的...