从SQL CLR函数调用System.Diagnostics.Process.Start,其中包含带有xml的param

时间:2011-01-10 16:16:11

标签: c# sql-server clr clrstoredprocedure

我在SQL Server 2008 CLR项目中有一个存储过程。此函数使用包含某些xml的参数调用控制台应用程序。

[Microsoft.SqlServer.Server.SqlProcedure()]
public static SqlInt32 ExecuteApp(SqlString utilPath, SqlString arguments, ref SqlString result)  
{
    ProcessStartInfo info  = new ProcessStartInfo("cmd.exe");
    Process p = new Process();

    try
    {
        //ProcessStartInfo to run the DOS command attrib

        info.RedirectStandardOutput = true;
        info.RedirectStandardError = true;
        info.UseShellExecute = false;
        info.CreateNoWindow = true;
        info.Arguments = string.Format(@"/c ""{0}"" {1}", utilPath, arguments);
        SqlContext.Pipe.Send(info.Arguments);

        p.StartInfo = info;
        p.Start();
        String processResults = p.StandardOutput.ReadToEnd();
        SqlContext.Pipe.Send(processResults);
        result = processResults;
        if (String.IsNullOrEmpty((String)result))
            result = p.StandardError.ReadToEnd();

        return 1;
    }
    finally
    {
        p.Close();
    }
}

这里的问题包含了包含xml的param。 这是执行存储过程的表达式:

    declare @Result nvarchar(max)
exec ExecuteApp 'C:\Console.exe', 'send "<messages><message>my message</message></messages>"', @Result out 
select @Result

执行存储过程后,我遇到如下错误:

  

&LT;这时出人意料。

我想注意,没有xml,一切正常。

1 个答案:

答案 0 :(得分:1)

您的XML包含由命令shell(><)解释的特殊字符。
您需要使用""引用其中的参数和转义引号。

此外,您应该直接执行您的程序(而不是cmd /c);这将解决你的一些问题。