如何在SQL用户定义函数中调用存储过程

时间:2009-11-18 12:21:11

标签: c# sql

我在SQL Project中创建了一个User Defined函数。此C#方法需要能够在同一数据库中调用存储过程。我该怎么做呢?

4 个答案:

答案 0 :(得分:2)

好的,所以我已经弄明白了。我需要做的是基本上访问托管CLR用户定义函数中的SQL存储过程。是的,它可能听起来像一个糟糕的设计问题,但在我的应用程序中,我需要在我的UDF中快速查找,经过几天思考这个(设计)的方法,没有别的办法。所以这里是我如何完成它的代码,从SQL中调用的UDF需要在方法签名之上具有以下属性: [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read,SystemDataAccess = SystemDataAccessKind.Read)]

在这个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;
    }
}

答案 1 :(得分:0)

您的SQL项目中的用户定义函数不在c#中,而是在SQL中。 如果你用c#编写,那么你的问题没有意义。

如果您想从c#调用存储过程,那么您需要查看ado.net 命名空间是System.Data.SQLClient

答案 2 :(得分:0)

假设你在谈论Managed / CLR user defined function,我认为你不能。

我能想到的唯一方法是,如果你从UDF中创建一个到sql server的新连接 - 我不能确定这会起作用,但我确信这个会是一个坏主意 - 不要这样做!

我不得不问 - 你为什么要这样做呢? CLR UDF的存在是为了在存储过程中使用托管代码的小片段(例如正则表达式),而不是处理大型结果集(这是SQL通常非常擅长的一件事)

答案 3 :(得分:0)

如果需要在数据库内的已编译C#方法中调用SP,则必须问自己设计是否有问题。管理代码不是为了重新编写Transact-SQL而是为了补充它本身无法做到的少数思想。

如果您需要拨打SP,那么您的代码应该在另一个SP中。如果你没有说出更多的细节,那就很难决定。