如何返回SqlCommand存储过程执行的语法?

时间:2014-02-14 13:41:51

标签: c# sql-server stored-procedures

我有一个名为My_StoredProcedure的存储过程,如下所示:

create proc My_StoredProcedure (val1 int, val2 int)
as
    insert into mytable values (val1,val2)

如果执行错误,我需要获取此存储过程语法

未获取存储过程名称

这是我的代码

cmd = new SqlCommand("My_StoredProcedure", cn);
cn.open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("val1",1);
cmd.Parameters.AddWithValue("val2",2);

try
{
    cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
    return ???(what stored procedure executed syntax)???;
}

1 个答案:

答案 0 :(得分:0)

我认为您希望无法执行的过程定义?您可以通过查询sys.sql_modules

来获取此信息
try
{
    cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
    var sql = "select top (1) [definition] " +
              "from sys.sql_modules m " +
              "join sys.objects o " +
              "on m.object_id = o.object_id " +
              "where o.name = 'My_StoredProcedure' ";

    var qry = new SqlCommand(sql, conn);

    var rdr = qry.ExecuteReader(CommandBehavior.SingleRow);

    string definition = null;

    while(rdr .Read())
    {
        definition = rdr["definition"].ToString();
    }
}

或您的查询可以使用sys.objects

SELECT OBJECT_DEFINTION(object_id)
FROM sys.objects
WHERE name = 'My_StoredProcedure' 
AND [type] IN ('P', 'PC')

要清除'清除'定义,即摆脱CREATE PROC可能是最容易在C#中使用一些正则表达式完成的。