.NET Framework 的公共语言运行时(CLR)允许使用描述性关键字(称为属性)。 这些属性为许多元素(如方法和类)提供了其他信息。 这些属性使用对象的元数据保存在程序集中,可用于将代码描述到其他开发工具或影响 SQL Server 中的运行时行为。
向 SQL Server 注册 CLR 例程时,SQL Server 将派生有关该例程的一组属性。 这些例程属性确定例程的功能,包括是否可以为例程编制索引。 例如,设置 DataAccess
属性以 DataAccessKind.Read
允许访问 CLR 函数内 SQL Server 用户表中的数据。 以下示例演示了一个简单的情况,在该情况下,该 DataAccess
属性设置为便于从用户 表表 1 进行数据访问。
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;
public partial class UserDefinedFunctions
{
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static string func1()
{
// Open a connection and create a command
SqlConnection conn = new SqlConnection("context connection = true");
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT str_val FROM table1 WHERE int_val = 10";
// where table1 is a user table
// Execute this command
SqlDataReader rd = cmd.ExecuteReader();
// Set string ret_val to str_val returned from the query
string ret_val = rd.GetValue(0).ToString();
rd.Close();
return ret_val;
}
}
Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient
Public partial Class UserDefinedFunctions
<SqlFunction(DataAccess = DataAccessKind.Read)> _
Public Shared Function func1() As String
' Open a connection and create a command
Dim conn As SqlConnection = New SqlConnection("context connection = true")
conn.Open()
Dim cmd As SqlCommand = conn.CreateCommand()
cmd.CommandText = "SELECT str_val FROM table1 WHERE int_val = 10"
' where table1 is a user table
' Execute this command
Dim rd As SqlDataReader = cmd.ExecuteReader()
' Set string ret_val to str_val returned from the query
Dim ret_val As String = rd.GetValue(0).ToString()
rd.Close()
Return ret_val
End Function
End Class
对于 Transact-SQL 例程,SQL Server 直接从例程定义派生例程属性。 对于 CLR 例程,服务器不会分析例程的正文来派生这些属性。 相反,你可以对 .NET Framework 语言中实现的类和类成员使用自定义属性。
CLR 例程、用户定义的类型和聚合所需的自定义属性在命名空间中 Microsoft.SqlServer.Server
定义。