Написание пользовательской функции SQLServer на C # - PullRequest
2 голосов
/ 15 декабря 2011

Я изо всех сил пытаюсь найти много информации на эту тему, поэтому мне интересно, сможет ли кто-нибудь из вас просветить меня.

У меня в основном есть мини-приложение, написанное на C #, которое принимает строку, выполняет несколько манипуляций с ней и затем возвращает результат. Теперь я хочу создать эту функцию в SQLServer, чтобы можно было легко запускать ее для записей в моих таблицах.

Я знаю, как создавать и запускать пользовательские функции SQLServer, написанные на C # (т. Е. Зарегистрировать .dll в SQLServer перед созданием для него функции), но, похоже, я не могу получить какой-либо вывод из своих функций. Например, если у меня есть следующая функция 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 ]

4 голосов
/ 15 декабря 2011

Вам не хватает скобки:

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
0 голосов
/ 10 ноября 2015

«Вам не хватает скобок»

Я думаю, что это вводит в заблуждение.В этом примере показаны способы вызова функции как в скобках, так и в скобках.

Реальная точка зрения состоит в том, что вывод никогда не был назначен чему-либо и поэтому был отброшен, как показано в этом примере.

EXEC [dbo] .HelloWorld 'Hello World, это моя строка!'

Добавляя слово SELECT перед вызовом функции или назначая егопеременная (как в «exec @a =»), возвращаемое значение из вызова функции будет присвоено локальной переменной и станет доступным для использования вызывающим кодом.(В случае варианта SELECT локальная переменная создается за кулисами и затем используется внутренне редактором запросов, чтобы можно было отобразить результат.)

Вызов функции действительно работал все время, ноФрагмент кода ничего не сделал для захвата выходных данных.

(Извините, что не смог опубликовать это как комментарий под ответом Себастьяна, но у меня недостаточно репутационных баллов, чтобы сделать это.)

0 голосов
/ 15 декабря 2011

Вы пробовали:

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

?

...