Sample。emp 表:CREATE TABLE emp (
empno INT PRIMARY KEY,
ename NVARCHAR(50),
sal DECIMAL(10,2),
deptno INT
);

EmployeeClr,撰寫靜態方法並標記 [SqlFunction]/[SqlProcedure]:using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class EmployeeClr
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static SqlDecimal GetAvgSalary(SqlInt32 deptNo)
{
using (var conn = new System.Data.SqlClient.SqlConnection("context connection=true"))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT AVG(sal) FROM emp WHERE deptno = @deptno";
cmd.Parameters.AddWithValue("@deptno", deptNo.Value);
return new SqlDecimal((decimal)cmd.ExecuteScalar());
}
}
[SqlProcedure]
public static void InsertEmployee(SqlInt32 empno, SqlString ename, SqlDecimal sal, SqlInt32 deptno)
{
using (var conn = new System.Data.SqlClient.SqlConnection("context connection=true"))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO emp VALUES (@empno, @ename, @sal, @deptno)";
cmd.Parameters.AddWithValue("@empno", empno.Value);
cmd.Parameters.AddWithValue("@ename", ename.Value);
cmd.Parameters.AddWithValue("@sal", sal.Value);
cmd.Parameters.AddWithValue("@deptno", deptno.Value);
cmd.ExecuteNonQuery();
}
}
}
-- 測試函數
SELECT dbo.GetAvgSalary(10);
-- 測試預存程序
EXEC dbo.InsertEmployee 999, N'測試員工', 50000, 20;
SELECT * FROM emp WHERE empno = 999;
context connection=true:使用目前工作階段的內部連線,效能最佳、自動參與交易。DataAccessKind.Read / ReadWrite:宣告函數/程序是否存取資料,影響部署權限檢查。SAFE (預設) 僅允許內部運算;需跨資料庫/外部資源時設為 EXTERNAL_ACCESS 並簽署強名稱。