CLR Scalar-valued函数

昨天有学习了返回表自定义函数《CLR Table-Valued函数http://www.cnblogs.com/insus/p/4378354.html。今天学习另一个,实现返回标量(Scalar-valued) function。

 
这个标量函数获取分类全名。

SELECT [CategoryName] + '--' + [KindName] + '--' + [FruitName] FROM [dbo].Tvf_Fruit() WHERE [Fruit_nbr] = @Fruit_nbr


想把这句写成一个标量函数public static SqlString Tvf_GetFullName(SqlByte fruit_nbr),编写clr函数,应当使用static关键词。参考数据类型,使用SQL CLR TYPE。


可复制代码:

复制代码
 [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlString Tvf_GetFullName(SqlByte fruit_nbr)
    {
        SqlConnection connection = new SqlConnection("Context connection=true");
        connection.Open();

        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandText = "SELECT [CategoryName] + '--' + [KindName] + '--' + [FruitName] FROM [dbo].Tvf_Fruit() WHERE [Fruit_nbr] = @Fruit_nbr";

        SqlParameter param = new SqlParameter("@Fruit_nbr", SqlDbType.TinyInt);
        param.Value = fruit_nbr;
        command.Parameters.Add(param);

        string rtn = Convert.ToString(command.ExecuteScalar());

        connection.Close();

        return new SqlString(rtn);
    }
复制代码


编译为dll。然后部署至SQL,可执行下面代码,也可以参考前几篇的手动在Microsoft SQL Server Management Stuido下进行。更详细《简单创建与布署CLR存储过程http://www.cnblogs.com/insus/p/4371762.html


可复制代码:

复制代码
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'Tvf_GetFullName')
    DROP FUNCTION Tvf_GetFullName;
GO

IF EXISTS (SELECT * FROM sys.assemblies WHERE name = 'FruitClr')
    DROP ASSEMBLY FruitClr;
GO

CREATE ASSEMBLY FruitClr
FROM 'E:\FruitClr.dll' 
WITH PERMISSION_SET = SAFE;
GO

CREATE FUNCTION Tvf_Fruit()
RETURNS TABLE (
    Fruit_nbr TINYINT,
    FruitCategory_nbr TINYINT,
    CategoryName NVARCHAR(30),
    FruitKind_nbr TINYINT,
    KindName NVARCHAR(30),
    FruitName NVARCHAR(30)
)
AS
EXTERNAL NAME [FruitClr].UserDefinedFunctions.Tvf_Fruit;
GO

CREATE FUNCTION Tvf_GetFullName(@Fruit_nbr tinyint) 
RETURNS NVARCHAR(MAX) 
AS EXTERNAL NAME [FruitClr].UserDefinedFunctions.Tvf_GetFullName; 
GO
复制代码


执行结果:


下面可对比一下普通的SQL语句与Clr写好的函数效率比较:

 

http://www.cnblogs.com/insus/p/4380080.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值