参考:http://wenku.it168.com/d_000642903.shtml

打开vs,创建数据库项目,添加新项,选择sql clr c#, 选择存储过程。

样例:

[Microsoft.SqlServer.Server.SqlProcedure]
    public static int  mypro2(int id, string mc, out string err)
    {
        using (SqlConnection cn = new SqlConnection("context connection=true"))
        {
            cn.Open();
            SqlCommand cmd = cn.CreateCommand();
            cmd.CommandText = $"insert into t1(id,mc) values({id}, '{mc}')";
            cmd.ExecuteNonQuery();
        }
        err = mc + id;
        return 100;
        // 在此处放置代码
    }

可以返回记录集,示例见:https://blog.csdn.net/tjvictor/article/details/4731052

有两种方法:

[Microsoft.SqlServer.Server.SqlProcedure]
    public static void mypro3()
    {
        //返回 记录集
        using (SqlConnection cn = new SqlConnection("context connection=true"))
        {
            cn.Open();
            SqlCommand cmd = cn.CreateCommand();
            cmd.CommandText = $"select * from t1";
           
            SqlContext.Pipe.Send(cmd.ExecuteReader());
          
        }

}

[Microsoft.SqlServer.Server.SqlProcedure]
    public static void mypro4()
    {
        //返回DataSet内容
        SqlDataRecord dataRecord = new SqlDataRecord(new SqlMetaData[] {
            new SqlMetaData("Col1", SqlDbType.NVarChar,100),
            new SqlMetaData("Col2", SqlDbType.Int)
                });
        //开始填充
        SqlContext.Pipe.SendResultsStart(dataRecord);

for (int count = 0; count < 5; count++)
        {
            //SqlDataRecord.SetString类似DataRow的功能,像Table中填充值
            dataRecord.SetString(0, count.ToString());
            dataRecord.SetInt32(1, count);
            //通过SendResultsRow把数据填充到Table,相关于Table.Rows.Add(DataRow);
            SqlContext.Pipe.SendResultsRow(dataRecord);
        }
        //填充结束,返回结果集
        SqlContext.Pipe.SendResultsEnd();

}

[Microsoft.SqlServer.Server.SqlProcedure]

public static void SPOne()

{

SqlPipe p;

SqlCommand sCmd = new SqlCommand();

sCmd.CommandText = "Select * from Person";

p = SqlContext.Pipe;

p.ExecuteAndSend(sCmd);

}

重新生成程序,并发布,即可写入数据库。

1. 发布时可能的问题:sqlserver版本不匹配(右键项目属性,选择目标数据库版本)

2. 发布时失败:..net framework版本不匹配,ms2008只支持.net2和.net3.5等版本(右键项目属性,选择.net frameork版为2)

发布成功后,在数据库中可查看到此存储过程。

在数据库中启用clr:

exec sp_configure 'clr enabled',1
reconfigure with override

上述存储过程的调用示例:

USE [test]
GO

DECLARE    @return_value int,
        @err nvarchar(max)

EXEC    @return_value = [dbo].[mypro2]
        @id = 844,
        @mc = N'95k在',            --前面不加N测试也正确
        @err = @err OUTPUT

SELECT    @err as N'@err'    --前面不加N测试也正确

SELECT    'Return Value' = @return_value

GO

发布和部署:

在vs2017中直接点“发布”,连接到mssql后,在mssql中生成相应存储过程,完成部署过程。

或:

在vs2017中点“发布”时,选择生成脚本,最后生成sql文件,在mssql的管理器中打开脚本文件,打开“查询”菜单,选择“sqlcmd”模式,运行以上文件即可生成相应存储过程。在脚本中,c#装配件被转换成了16进制字符串形式保存。

在生成的sql脚本中,有数据库文件路径,这个经测试,不重要,路径随便更改一下也可运行成功。如下:

:setvar DatabaseName "test"
:setvar DefaultFilePrefix "test"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\"
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\"

另外部署说明:

vs连接mssql时直接发布,可以生成相关存储集和存储过程,后续更新时可以生成sql脚本执行,但第一次无法使用脚本执行生成存储过程,提示装配件不存在,经查看在“C:\Users\ljq\AppData\Local\Microsoft\VisualStudio\SSDT\托管存储过程测试”目前下生成了mdf和ldf两个文件。

部署可以使用dll文件,参考:https://www.cnblogs.com/Brambling/p/8016060.html

CREATE ASSEMBLY MyFirstUdp FROM 'C:\Programming\MyFirstUdp.dll';
CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.StoredProcedures.HelloWorld;
EXEC HelloWorld;

托管代码编写mssql存储过程的更多相关文章

  1. 实验9-1 编写一个存储过程proc_test_func

    在TestDB数据库中,编写一个存储过程proc_test_func,要求如下: 1)输入参数 一个整型的输入参数 @value 2)要求在一个select语句返回: @value的绝对值, 此绝对值 ...

  2. 编写CLR存储过程中使用SqlDataRecord

    温习一下这些天学习的CLR编程,存储过程,函数. 编写CLR的存储过程,运行起来的效率,果然比普通的SQL语句,存储过程或是函数均高. 以后专案需求,或是执行效率较高的SQL,得写成CLR程序,再部署 ...

  3. SQLServer2008:助您轻松编写T-SQL存储过程(原创)【转】

      本文主要介绍 SQLServerExpress2008不用第三方工具调试T-SQL语句,经过本文的介绍,用SQLSERVER2008 Manage studio 编写.调试T-SQL存储过程都将是 ...

  4. Oracle结果集 (MSSQL存储过程写报表)

    接触SQL Server比较多,写报表是用存储过程实现. 对Oracle实现像MSSQL那样,还是有很多疑问

  5. MSSQL存储过程接收另一个存储过程返回列表

    CREATE TABLE #tmp(m_Meter_ID varchar(20),low_Voltage int,num_Attack int,num_DER int,company_id int,a ...

  6. mysql使用navicat编写调用存储过程

    在Navicat里面,找到函数,右键,新建函数,选择过程,如果有参数就填写函数,如果没有就直接点击完成 在BEGIN......END中间编写要执行的sql语句,例如下面存储过程取名为pro_data ...

  7. MSSQL手札三 MSSQL存储过程

    --存储过程完成一段sql代码的封装 create proc trim --参数列表,多个间用逗号分隔 ) as --自定义代码段 ) set @str1=LTRIM(RTRIM(@str)) pri ...

  8. MSSQL存储过程(好久的笔记,翻出来怀念下)

    语法结构: create proc 名称 参数列表 as 代码段 调用: exec 存储过程名称 参数列表 要点: .可以使用output修饰参数 .可以使用默认值,注意需要将最后的参数设置成默认值 ...

  9. MSSQL - 存储过程Return返回值

    1.存储过程中不使用外部参数. 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================== ...

随机推荐

  1. Selenium clear()方法无法清掉数据

    问题描述 clear()方法执行过后, 数据还是在. 根本原因 存在镜像节点. 操作clear()清掉数据后, 镜像节点的数据还在, 就会再补充回去. 解决办法 添加下面代码就可以连同镜像的数据一起去 ...

  2. Paxos可容错的一致性协议

    一致性问题要求多个process对一个值达成一致.基于消息传递的分布式系统中,在不考虑消息篡改等拜占庭错误的情况下,Paxos可以解决在进程退出,消息延迟,丢失,重复等异常发生的环境中对某个值达成一致 ...

  3. [翻译] CBStoreHouseRefreshControl

    CBStoreHouseRefreshControl What is it? A fully customizable pull-to-refresh control for iOS inspired ...

  4. jQuery插件实例二:年华时代插件ReturnTop回到首页

    这个插件功能在于当网页内容高度很高时,方便用户快速回到顶部.核心在于对屏幕高度的获取,定时器的使用,在引用代码后,只使用$.nhsd.returnTop();即可实现效果 效果图: 代码: ; fun ...

  5. [2018HN省队集训D8T1] 杀毒软件

    [2018HN省队集训D8T1] 杀毒软件 题意 给定一个 \(m\) 个01串的字典以及一个长度为 \(n\) 的 01? 序列. 对这个序列进行 \(q\) 次操作, 修改某个位置的字符情况以及查 ...

  6. 题解 P1018 【乘积最大】

    题目链接:P1018 乘积最大 题面 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面 ...

  7. 编程题1001.A+B Format (20)

    代码链接点击这里 由于有点久没写代码了,本次作业提交了三次才全部正解. 一开始以为是非常容易的题目,就没有带入多组数据,便以最简单的思路提交了代码. 发现了有特别多错误后,我并没有选择马上找同学帮忙, ...

  8. Css中路径data用法

    Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入. data:,文本数据 data:text/plain,文本数据 data: ...

  9. 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理

    原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...

  10. 使用MS的ScriptDom来拆解TSQL脚本

    此处提供9.1.40413.0版本的DLL一共4个:Microsoft.Data.Schema.dll.Microsoft.Data.Schema.ScriptDom.dll.Microsoft.Da ...