2011-12-15 3 views
2

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

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

Я знаю, как создавать и запускать SQLServer UDF, написанные на 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 необходим, чтобы на самом деле распечатать результат, но я не уверен.

Возможно, это очень простое решение, но, как я уже упоминал ранее, я действительно пытаюсь найти полезную информацию там.

+1

только гадать, но вы пытались сделать вызов: 'SELECT [ dbo] .HelloWorld 'Hello World, это моя строка! ' –

+0

Да, я попытался, но я получу - Идентификатор с несколькими частями" dbo.HelloWorld "не удалось связать - ошибка – Rich

ответ

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 
+0

Да, это так. Мне не хватало круглых скобок. – Rich

0

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

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

?

+0

Да, но я получаю ошибку. Идентификатор из нескольких частей« dbo.HelloWorld »не может быть связан. – Rich

-1

"У вас не хватает скобку"

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

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

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

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

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

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