在C#中编写SQLServer用户定义函数

时间:2011-12-15 10:53:39

标签: c# sql sql-server clr user-defined-functions

我很难找到关于这个主题的更多信息,所以我想知道你们中是否有人能够启发我。

我基本上有一个用C#编写的迷你应用程序,它接受一个字符串,对它执行一些操作然后返回结果。我现在希望在SQLServer中创建此函数,以便我可以轻松地在表中的记录上运行它。

我知道如何创建和运行用C#编写的SQLServer UDF(即在为它创建函数之前在SQLServer中注册.dll),但我似乎无法从我的函数中获取任何输出。例如,如果我有以下C#函数......

using System;
using Microsoft.SqlServer.Server;

public static class MyClrUdfClass
{
    [SqlFunction]
    public static string HelloWorld(string myString)
    {
        return (myString);
    }
}

我在这样的SQLServer中运行它......

USE [AdventureWorksDW2008R2]
GO
EXEC [dbo].HelloWorld'Hello World, this is my string!'
GO

运行该函数时,我在SQLServer中获得的唯一输出是“命令已成功完成”。那么myString在哪里?我希望实际打印结果需要一些SQL,但我不确定。

这可能有一个非常简单的解决方案,但正如我之前提到的,我真的很难找到任何有用的信息。

3 个答案:

答案 0 :(得分:4)

您缺少括号:

SELECT [dbo].HelloWorld ('Hello World, this is my string!')

或尝试这种方式:

declare @a varchar(max)
exec @a = [dbo].HelloWorld 'Hello World, this is my string!' 
print @a

答案 1 :(得分:0)

你试过了吗?

USE [AdventureWorksDW2008R2]
GO
select [dbo].HelloWorld('Hello World, this is my string!')
GO

答案 2 :(得分:-1)

"您缺少括号"

我认为这是误导。该示例显示了括号和非括号的调用函数的方法。

真正的一点是,输出从未分配给任何东西,因此被丢弃,如本例所示。

  

EXEC [dbo] .HelloWorld' Hello World,这是我的字符串!'

通过在函数调用前添加单词SELECT,或将其分配给变量(如" exec @a ="),函数调用的返回值将分配给局部变量,可供调用代码使用。 (对于SELECT变体,局部变量在幕后创建,然后由查询编辑器在内部使用,以便显示结果。)

函数调用一直在运行,但代码片段没有做任何事情来捕获它的输出。

(很抱歉,根据塞巴斯蒂安的回答,我无法将此作为评论发布,但我没有足够的声誉点来做到这一点。)