Вызовите System.Diagnostics.Process.Start из функции SQL CLR, содержащей параметр с xml - PullRequest
0 голосов
/ 10 января 2011

У меня есть хранимая процедура в проекте 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.Это выражение для выполнения хранимой процедуры:

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

После выполнения хранимой процедуры я получил сообщение об ошибке:

<в это время было неожиданно. </p>

Хочу заметить, что без xml все работает нормально.

1 Ответ

1 голос
/ 10 января 2011

Ваш XML содержит специальные символы, которые интерпретируются командной оболочкой (> и <).
Вам нужно заключить в кавычки параметр и экранировать кавычки внутри него: "".

Кроме того, вы должны выполнить вашу программу напрямую (не через cmd /c); это решит некоторые ваши проблемы.

...