从SQLCLR获得结果

时间:2012-05-14 13:17:52

标签: sql sql-server tsql sqlclr

我有以下问题:我必须从局域网内的各种客户端访问DLL,它驻留在承载SQL Server的PC中。

我需要从所有客户端访问此DLL,以使其返回合法税务校验和。

我想创建一个CLR过程来调用服务器中的DLL并返回校验和。

我按照一些互联网示例创建了一个简单的HelloWorld应用....

我在C#中创建了一个DLL

[SqlProcedure]
public static int HelloWorld(int h)
{
    return h;
}

我在SQL Server中创建了程序集:

CREATE ASSEMBLY MyChecksum
    from 'C:\Users\Panos\Documents\Visual Studio 2010\Projects\DigitalSignature\Algobox\bin\Debug\checksum.dll'
    WITH PERMISSION_SET = UNSAFE  

我创建了程序

CREATE PROC sp_mychecksum (@h int)
AS
EXTERNAL NAME MyAlgobox.Signatures.HelloWorld 

最重要的是,当我执行我的程序(exec sp_mychecksum
12
)时,我只收到一条消息

  

命令已成功完成

而不是12

任何线索?

1 个答案:

答案 0 :(得分:0)

您定义事物的方式,HelloWorld()方法的返回值将作为存储过程的返回值返回。因此,正如@Damien_The_Unbeliever在您的问题评论中所建议的那样,这将为您提供您在SQL Server上寻找的内容:

DECLARE @rc int
EXEC @rc = sp_mychecksum 12
SELECT @rc

要让HelloWorld()方法将值作为结果集返回,您必须执行以下操作(警告,未经测试):

[SqlProcedure]
public static int HelloWorld(int h) {
    SqlDataRecord record = new SqlDataRecord(new SqlMetaData("colname", SqlDbType.Int));
    record.SetSqlInt32(0, h);
    SqlContext.Pipe.Send(record);
}

但是,根据您的用例,我认为您希望将现有的CLR例程映射到SQL函数,而不是存储过程。例如,像这样:

CREATE FUNCTION dbo.f_mychecksum(@h int) RETURNS int
WITH EXECUTE AS CALLER 
AS
EXTERNAL NAME MyAlgobox.Signatures.HelloWorld

然后像这样使用它:

SELECT dbo.f_mychecksum(12)