从SQLCLR调用进程时,被调用进程必须是64位吗?

时间:2017-05-03 20:39:24

标签: sql-server sqlclr

假设我想从Sql Server中运行的SqlClr存储过程调用32位可执行命令,使用类似下面的代码:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Diagnostics;
using System.Text;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void ecommerce_export_cmd(SqlString directoryPath,
                                            SqlString execName,
                                            SqlString arguments)
    {
        // Make sure the file exists
        string fullPath = Path.Combine(directoryPath.Value, execName.Value);
        FileInfo fi = new FileInfo(fullPath);
        if (!fi.Exists)
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.CommandText = string.Format(
                        "raiserror('File ->{0}<- is not found.',16,1)",
                          execName.Value);
                try { SqlContext.Pipe.ExecuteAndSend(cmd); }
                catch { return; }
            }
        }
        // ProcessStartInfo to run the DOS command attrib
        ProcessStartInfo pInfo = new ProcessStartInfo("cmd.exe");
        pInfo.WorkingDirectory = directoryPath.Value;
        pInfo.UseShellExecute = true;
        // quote the arguments in case it has spaces
        pInfo.Arguments = string.Format("{0} {1}", execName.Value, arguments.Value);
        // Start a new process and wait for it to exit
        Process process = new Process();
        process.StartInfo = pInfo;        
        process.Start();
        process.WaitForExit();
    }
}

考虑到SqlServer是一个64位进程,给定上面的代码,我应该 期望由于不同的位数导致的潜在问题?我当然不想要 崩溃SqlServer。

1 个答案:

答案 0 :(得分:1)

我希望如果有问题会通过错误消息指出。一般来说,我不认为您应该担心这一点,因为您启动的任何进程都不是SQL Server的一部分(因此只有在程序集标记为UNSAFE时才可能)。

实际上, cmd.exe 是一个64位应用,在使用{{{{>>时,您不需要首先执行 cmd.exe 1}},你可以执行命令或应用程序。 CMD 是一个shell,使用UseShellExecute = true创建新流程已调用 cmd.exe