1. 程式人生 > >C# 自定義sqlserver表值函式

C# 自定義sqlserver表值函式

首先普及一下什麼是表值函式,我是說個人理解啊,就是傳進去一個引數或者不傳引數,返回一個列表的函式,這個是通俗一點的說法,官方解釋Sql server 的表值函式是返回一個Table型別,table型別相當與一張儲存在記憶體中的一張虛擬表 下面說做法。

1,首先新建一個 C# CLR 資料庫專案

2,在裡面新建使用者自定義函式檔案,其實就是一個類

這裡可以直接右鍵生成和部署,這裡要注意了,選擇 net的版本,注意C# 引數的型別是否和資料庫型別匹配。

因為是表值函式,所以首先要宣告欄位,這裡注意,我是把Participle 類宣告在 UserDefinedFunctions 類當中. 宣告完了 就要返回    接著是自己的業務邏輯

下面是業務類的簡單寫法,

[SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "ParticipleFunt_FillRow", TableDefinition = "ContentId nvarchar(400), Content nvarchar(400),Sort int")]
    public static IEnumerable ParticipleFunt(SqlString modified)
    {
        ArrayList resultCollection = new ArrayList();
        string [] strmodified = modified.ToString().Split('\r');
        for (int i = 0; i < strmodified.Length; i++)
        {
           resultCollection.Add(new Participle((i+1).ToString(),strmodified[i], i+1)); 
        }

        return resultCollection;
    }


解釋一下上面的特性 (DataAccessKind.Read 描述使用者定義的方法或函式所使用的使用者資料訪問型別),(FillRowMethodName = "ParticipleFunt_FillRow", 指明返回函式)(TableDefinition = "ContentId nvarchar(400), Content nvarchar(400),Sort int“ 表示返回的列,這裡一定要注意哦,c# 的欄位型別一定要和 sqlserver 的欄位型別匹配,要不程式一直報錯,建議開啟除錯裡面的輸出,能看到時時編譯的錯誤)

做完上面的就可以右鍵生成和部署了, 生成很簡單,部署也很簡單,都是點選專案,然後在右鍵選單裡面。

最後再說幾句,因為是表值函式,所以我們自定義的時候返回表結構用的是 IEnumerable 

最後測試語句用的是 select * from dbo.ParticipleFunt( 引數/null);

以上是C#編寫表值函式的所有做法。