Как я могу вызвать хранимую процедуру в пользовательской функции SQL - PullRequest
1 голос
/ 18 ноября 2009

Я создал пользовательскую функцию в проекте SQL. Этот метод C # должен иметь возможность вызывать хранимую процедуру в той же базе данных. Как бы я поступил так?

Ответы [ 4 ]

2 голосов
/ 19 ноября 2009

ОК, так что я понял это. Что мне нужно было сделать, так это получить доступ к хранимой процедуре SQL в определяемой пользователем функции управляемого CLR. И да, это может звучать как проблема с плохим дизайном, но в моем приложении мне нужно быстро просмотреть свой UDF, после нескольких дней обдумывания пути обхода этого (дизайна) другого пути просто нет. Итак, вот код того, как я это сделал, UDF, который вызывается из SQL, должен иметь следующие атрибуты над сигнатурой метода: [Microsoft.SqlServer.Server.SqlFunction (DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)] * ​​1001 *

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

(имена переменных и т. Д. Не являются теми, которые я использовал)

private static int GetLookup(int id_Lookup)
{
    try
    {
        using (SqlConnection sqlConn = new SqlConnection("Context Connection=true"))
        {
            sqlConn.Open();
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = "uspApp_GetLookup";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = sqlConn;
                cmd.Parameters.AddWithValue("ID_Lookup", ID_Lookup);
                SqlParameter parameter = new SqlParameter("OutputValue", null);
                parameter.DbType = DbType.Int32;
                parameter.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(parameter);

                cmd.ExecuteNonQuery();

                if (cmd.Parameters != null && cmd.Parameters["ID_OutputValue_Account"] != null)
                {
                    return int.Parse(cmd.Parameters["OutputValue"].Value.ToString());
                }
                return -1;
            }
        }
    }
    catch
    {
        throw;
    }
}
0 голосов
/ 18 ноября 2009

Предполагая, что вы говорите о Управляемой / CLR пользовательской функции , я не думаю, что вы можете.

Единственный способ, которым я могу придумать, это то, что вы можете сделать это, если вы создадите новое соединение с сервером sql из вашего UDF - я не уверен, что это будет работать, но я уверен, что это было бы плохой идеей - не делай этого!

Я должен спросить - зачем тебе это делать? CLR UDF существуют с целью использования небольших фрагментов управляемого кода (например, регулярных выражений) в ваших хранимых процедурах, а не обработки больших результирующих наборов (это одна вещь, с которой SQL обычно очень хорошо справляется)

0 голосов
/ 18 ноября 2009

Если вам нужно вызвать SP в скомпилированном методе C # внутри базы данных, вы должны спросить себя, если что-то не так с вашим дизайном. Управляемый код предназначен не для перестановки Transact-SQL, а для дополнения нескольких идей, которые он не может сделать сам по себе.

Если вам нужно вызвать SP, тогда ваш код должен быть в другом SP. Althought трудно решить, если вы не говорите больше деталей.

0 голосов
/ 18 ноября 2009

ваша Пользовательская функция внутри вашего проекта SQL не в c #, а в SQL. Если вы написали это на c #, тогда ваш вопрос не имеет смысла.

Если, однако, вы хотите вызвать сохраненный процесс из c #, вам нужно взглянуть на ado.net пространство имен - System.Data.SQLClient

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...