首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SQLCLR获得结果

从SQLCLR获得结果
EN

Stack Overflow用户
提问于 2012-05-14 13:17:52
回答 1查看 262关注 0票数 0

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

我需要访问这个DLL从所有客户端,以使它返回一个合法的税收核对。

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

我遵循一些互联网的例子,并创建了一个简单的HelloWorld应用程序..。

我在C#中创建了一个DLL

代码语言:javascript
复制
[SqlProcedure]
public static int HelloWorld(int h)
{
    return h;
}

我在Server中创建了程序集:

代码语言:javascript
复制
CREATE ASSEMBLY MyChecksum
    from 'C:\Users\Panos\Documents\Visual Studio 2010\Projects\DigitalSignature\Algobox\bin\Debug\checksum.dll'
    WITH PERMISSION_SET = UNSAFE  

我创建了这个程序

代码语言:javascript
复制
CREATE PROC sp_mychecksum (@h int)
AS
EXTERNAL NAME MyAlgobox.Signatures.HelloWorld 

底线是当我执行我的过程时(exec sp_mychecksum )

12)我只收到一条消息

成功完成

命令

而不是12

有什么线索吗?

EN

回答 1

Stack Overflow用户

发布于 2012-05-14 14:33:23

按照定义事物的方式,来自HelloWorld()方法的返回值将作为存储过程的返回值返回。因此,正如@Damien_The_Unbeliever在对您的问题的评论中所建议的,这将使您在Server上寻找什么:

代码语言:javascript
复制
DECLARE @rc int
EXEC @rc = sp_mychecksum 12
SELECT @rc

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

代码语言:javascript
复制
[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函数,而不是存储过程。例如,如下所示:

代码语言:javascript
复制
CREATE FUNCTION dbo.f_mychecksum(@h int) RETURNS int
WITH EXECUTE AS CALLER 
AS
EXTERNAL NAME MyAlgobox.Signatures.HelloWorld

然后像这样使用它:

选择dbo.f_mychecksum(12)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10584125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档