一、使用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語言來編寫,普通的...