SQLCLR(二)存储过程和自定义函数

2016-02-19 13:49 32 1 收藏

今天图老师小编要跟大家分享SQLCLR(二)存储过程和自定义函数,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

  自定义函数和存储过程在.net里其实都是方法。只是方法上方标注[Microsoft.SqlServer.Server.SqlProcedure]

  和[Microsoft.SqlServer.Server.SqlFunction]不同而已。自定义函数又分TVF函数和Scalar两种,最大区别在于TVF返回表后者返回Scalar(标量),这一篇我们做一下比较。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  先看两段代码

  存储过程:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    //这里是告诉sqlserver,这个方法要注册成存储过程
    //我感觉[Attribute]这个东西翻译成标签更形像:)
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void TestStoredProcedure(string name, ref string outstr)
    {
        // 在此处放置代码
        outstr = "hello," + name;

        using (SqlConnection cn = new SqlConnection())
        {
            //使用上下文链接也就是当前数据库链接
            cn.ConnectionString = "context connection=true";
            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = "Select * from userinfo";
                cn.Open();
                //SqlContext.Pipe.Send这个方法输出结果集
                //接受SqlDataReader,SqlDataRecord和string
                SqlContext.Pipe.Send(cmd.ExecuteReader());
                //你也可以用下边这样
                //SqlContext.Pipe.ExecuteAndSend(cmd);
            }
        }
    }
};

  执行存储过程

DECLARE @name nvarchar(4000)
DECLARE @outstr nvarchar(4000)
set @name='david fan'
-- TODO: 在此处设置参数值。
EXECUTE [TestProject].[dbo].[TestStoredProcedure]
   @name
  ,@outstr OUTPUT
print @outstr

  结果如下

  输出参数返回值

  自定义函数

  一,TVF函数

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  示例函数的作用是搜索目录下的某一类型的文件

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.IO;
using System.Security.Principal;

public partial class UserDefinedFunctions
{
    //需要返回一个表时用TVF(streaming table-valued function)
    //可以用select from 语句查询这个方法的返回
    //TVF需要返回Ienumerable接口,例如:Array,这里返回一个数组

    //FillRowMethodName为填充表行的方法
    //TableDefinition为表结构,对应FillRowMethodName方法的参数
    [Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "BuildRow",
     TableDefinition = "Name nvarchar(32), Length bigint, Modified DateTime")]
    public static IEnumerable FileListCs(string directoryName, string pattern)
    {
        FileInfo[] files;
       //模拟当前SQL安全上下文
        WindowsImpersonationContext OriginalContext= SqlContext.WindowsIdentity.Impersonate();
        try
        {
            DirectoryInfo di = new DirectoryInfo(directoryName);
            files = di.GetFiles(pattern);
        }
        finally
        {
            if (OriginalContext != null)
            {
                OriginalContext.Undo();
            }
        }
        return files;
    }

    public static void BuildRow(object Obj,
          ref SqlString fileName,
          ref SqlInt64 fileLength,
          ref SqlDateTime fileModified)
    {
        if (Obj != null)
        {
            FileInfo file = (FileInfo)Obj;
            fileName = file.Name;
            fileLength = file.Length;
            fileModified = file.LastWriteTime;
        }
        else
        {
            fileName = SqlString.Null;
            fileLength = SqlInt64.Null;
            fileModified = SqlDateTime.Null;
        }
    }
}

  因为这个函数对于sqlserver来讲要访问外部资源,所以需要配置一下项目和sqlserver2005

  项目右键属性,数据库,权限级别选外部

  打开sqlserver2005查询分析器执行下边语句 TestProject 为我的数据库名,你的如果不是,当然需要修改了。

ALTER DATABASE TestProject SET TRUSTWORTHY ON;

  成功后,项目右键部署。

  查询分析器中执行

SELECT * FROM [TestProject].[dbo].[FileListCs] (
   'c:'
  ,'*.txt')

  结果如下

  二,Scalar 函数

  这类函数返回类型如图,像SqlString这类sqlserver的scalar类型

  下面就是这类函数的一个小例子。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString ScalarFunction()
    {
        // 在此处放置代码
        return new SqlString("Hello");
    }
};


  sqlserver查询查询分析器中运行如下语句

SELECT [TestProject].[dbo].[ScalarFunction] ()

  结果如下

  第二篇完成,谢谢大家指教!

来源:http://www.tulaoshi.com/n/20160219/1605345.html

延伸阅读
《死侍》自定义键位心得完美自定义键位 方式1: Q作为传送反击键,鼠标左键轻击,右键重击,中键开枪,E键瞄准放大,R重装和互动,ZXC分别对应键盘的轻枪重,其他不变。 鼠标左键轻击,右键重击,中键开枪,这个几乎没什么可说的。 ZXC的定义是不想占用其他键位,再就是方便看刚开始了解连招,也比较形象和对称,有时还可以用来释放动...
超级美图Uphoto如何自定义图片存储位置   1)安装并打开超级美图Uphoto,点击主界面中的按钮。   2)取消并点击,在自定义存储位置列表中,选择要有存储路径即可           注 :更多精彩教程请关注图老师手机教程栏目,图老师手机数码群:296605639欢迎你的加入
PowerPoint借助自定义形状实现填充自定义图片   具体如何操作呢?以powerpoint2007为例,先在PPT页面中画一Tulaoshi.Com个形状,就像下面这个圆: 然后在形状填充里面选择图片或纹理填充: 插入自文件,选择想要的图片就OK了,就会出现下面的效果: 同样的效果还可以应用于艺术字(文本框不行)。如下: ...
标签: Web开发
一、基本概念: 1.标签(Tag): 标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的 2.标签库(Tag library): 由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。 3.标签库描述文件(Tag Library Desc...
--------------------------------------------------- -------自定义的TShockwaveflash.ocx---------------- --------------------------------------------------- --------------------------------------------------- 添加功能:对鼠标在 flash.ocx 中的信息捕获.---------- --------------------------------------------------- 可捕获鼠...

经验教程

126

收藏

11
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部