SQL Server 中的 CLR 程序集 C#

Posted

技术标签:

【中文标题】SQL Server 中的 CLR 程序集 C#【英文标题】:CLR Assembly C# inside SQL Server 【发布时间】:2011-09-15 21:19:43 【问题描述】: 有没有可能用C#做一个大项目(功能很多),那么, 然后为它创建 CLR 程序集, 在 SQL Server IN A STORED PROC 中,调用程序集中的函数,

表(我将传递给 ASSEMBLY)在其他存储过程中计算...

如果是这样,步骤是什么?

我在想这样的事情。

-- I have a stored proc that gets a table, let it be myStoredProcTable

--FIST ENABLE DATA ACCESS
EXEC sp_serveroption 'TheServerName', 'DATA ACCESS', TRUE

--main.sql calls yStoredProcTable.sql and the calls functionAssembly
SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(SERVERNAME, 'EXEC test.dbo.myStoredProcTable 1')


-- pass the table to assembly
-- how would i pass the table to assembly code?, Is this POSSIBLE?
    EXEC functionAssembly #tmpTable

------------------------------------------编辑

关注@faester 回复: - 我怎么能在代码中使用 XML,我建议使用 numberTOstring 的东西,但我猜 XML 选项在这里是最好的......

再一次,我真的这样做了,即使不是最好的选择......

【问题讨论】:

嗯,我愿意,但这些步骤已经完成。我是这么想的I can make a bridge for all this code 你的设计是 thedailywtf.com 的红地毯 你知道...现实世界的问题非常疯狂... 【参考方案1】:

是的,您可以注册程序集,但由于性能问题,这很少是一个好主意。

但是,如果您对标量值进行复杂的数值计算或类似操作,它可以为您提供很大的灵活性。但是问题仍然存在,SQL 本身是面向集合的,而 C# 不是,因此您很容易遇到不匹配的情况。

您还应该知道,您只能在静态类上导入静态成员。

但是一个例子 这个类 - 故意没有命名空间,因为在命名空间中导入类似乎是不可能的。

    public static class Math
    
        [Microsoft.SqlServer.Server.SqlFunction]
        public static int Add(int a, int b)
        
            return a + b;
        


        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void Void(int a, int b)
        
        
    

需要一些 SQL 才能使服务器准备好,并且您可能需要成为管理员。

    EXEC SP_CONFIGURE 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    -- CONSIDER: DROP ASSEMBLY SqlClr
    GO
    CREATE ASSEMBLY SqlClr 
    FROM 'pathtoassembly'
    WITH PERMISSION_SET = SAFE;
    GO
    SELECT * FROM sys.assemblies
    GO
    CREATE FUNCTION [MathAdd] (@a int, @b int)
    RETURNS INT 
    AS EXTERNAL NAME [SqlClr].Math.[Add]
    GO 
    CREATE PROCEDURE [Void] @a INT, @b INT
    AS EXTERNAL NAME [SqlClr].Math.[Void]
    GO 
    SELECT dbo.MathAdd (1, 2)
    EXEC void 1, 2

再次:你真的应该确信你需要这个,这不是一个好主意! (我曾经将它用于电子邮件验证,进行 dns 查找等,但那是在所有业务逻辑都用 SQL 编写的系统上。这很糟糕!)

一些有用的参考资料:

http://msdn.microsoft.com/en-us/library/ms189524.aspx

http://www.codeproject.com/KB/database/CLR_in_Sql_Server_2005.aspx

【讨论】:

是的,正是我需要的!!!!,只有一件事,当您将 2 ints 作为参数传递时,我正在考虑逐列传递并将其分配给 var,例如让我们说如果我有 10 列,则创建 10 个变量,然后将每一列分配给每个 var How would you pass or save in a variable a table column, I mean, as you said (@a int,@b int)... How to make a vector? 我不确定,但通常 CLR 和 SQL 类型之间存在映射,因此也许您可以传入一个 DataTable,它将转换为类似 DECLARE @t TABLE (id int not null) 的构造。不过,这纯粹是猜测。您的程序也可以从某个表中读取。 在此处进行类型转换:msdn.microsoft.com/en-us/library/ms131092.aspx - 看起来好像您无法输入集合,但正如我之前提到的,在这种情况下,除了标量值之外的任何东西都是昂贵的。输入集合的最佳选择可能是首先创建 SqlXml 元素。 我在考虑做一个列的选择表并将数字作为字符串declare @List varchar(max) select @List = isnull(@List + ',', '') + cast(ColumnName as varchar) from MyTable 这是事实吗?然后在 C# 代码中我会将字符串恢复为向量...,可以请按照您的 XML 想法发布一些代码.... 关于 XML 我只是认为在 XML 文档中传递多个值比在某些 csv 样式的字符串中更简单。我没有使用它,所以我无法生成任何代码。【参考方案2】:

使用SQL CLR 执行您描述的确切功能。

【讨论】:

是否可以使用该 c# 代码制作一个 dll 并在 SQL 中调用它?【参考方案3】:

It is possible。 (但请阅读 cmets)。

【讨论】:

以上是关于SQL Server 中的 CLR 程序集 C#的主要内容,如果未能解决你的问题,请参考以下文章

CLR SQL Server UDF 问题

如何在 SQL Server 的 clr 存储过程中执行动态 .net 代码

SQL Server 2017 上的 CLR 严格安全性

在 SQL Server CLR 程序集中使用 Microsoft Solver Foundation

使用 SQL-CLR 函数在 SQL Server 中验证加密数据的安全性

SQL CLR 在 SQL Server 中随机失败