Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server中的CLR程序集C 有没有可能用C语言做一个大项目,有很多功能,那么, 为其创建CLR程序集,然后, 在SQL Server中的存储过程中,调用程序集中的函数,_C#_Sql_Xml_Com_.net Assembly - Fatal编程技术网

C# SQL Server中的CLR程序集C 有没有可能用C语言做一个大项目,有很多功能,那么, 为其创建CLR程序集,然后, 在SQL Server中的存储过程中,调用程序集中的函数,

C# SQL Server中的CLR程序集C 有没有可能用C语言做一个大项目,有很多功能,那么, 为其创建CLR程序集,然后, 在SQL Server中的存储过程中,调用程序集中的函数,,c#,sql,xml,com,.net-assembly,C#,Sql,Xml,Com,.net 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

我将传递给程序集的表是在其他存储过程中计算的

如果是,步骤是什么? 我是这样想的

-- 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选项在这里是最好的


再说一次,我真的这么做了,即使不是最好的选择…

。但是请阅读注释。

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

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

但是,如果您对标量值进行复杂的数值计算或类似的操作,它可以为您提供很大的灵活性。但问题仍然是,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编写的系统上。这太糟糕了

一些有用的参考资料:


嗯,我很想,但这些步骤已经完成了。我这样想是为了让我能为所有这些代码搭建一座桥梁你的设计是通往Dailywtf.com的红地毯你知道。。。现实世界的问题是非常疯狂的…有可能用c代码创建一个dll并在SQL中调用它吗?是的,这正是我需要的!!!!,只有一件事,当你把2个整数作为参数传递时,我想一列一列地传递给一个变量,比如说,如果我有10列,做10个变量,然后给每个变量分配每列,你如何传递或保存一个变量表列,我的意思是,就像你说的@a int,@b int。。。如何生成向量?我不确定,但一般来说,CLR和SQL类型之间存在映射,因此您可以传入一个数据表,该数据表将转换为一个类似DECLARE@t TABLE id int not null的构造。不过,这纯粹是猜测。您的过程还可以从某些表中读取。此处的类型转换:-看起来您似乎无法输入集合,但正如我前面提到的,在这种上下文中,除了标量值之外的任何内容都非常昂贵。输入集合的最佳选项可能是首先创建SqlXml元素。我在考虑创建列的select表,并将数字设置为字符串declare@List varcharmax select@List=isnull@List“+”,“,+castColumnName作为MyTable中的varchar,这是否可行?,然后在C代码中,我将字符串还原为向量。。。,请您按照您的XML想法发布一些代码……关于XML,我只是想在XML文档中传递多个值比在csv样式的字符串中传递多个值更简单。我没有使用它,所以我无法生成任何代码。