我有以下问题:我必须从局域网内的各种客户端访问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
任何线索?
答案 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)