我有一个引导程序链接以下组件的安装:
SQL Server 2008 R2 - >数据库初始化批处理文件 - >产品MSI
使用Configuration.INI文件以静默方式安装SQL Server。没问题。
问题出在数据库初始化批处理文件中。批处理文件调用两个OSQL命令,为其提供一个.SQL文件(通过-i标志),用于数据库删除和数据库创建。
当我在调用OSQL后立即回显%ERRORLEVEL%时,错误级别 9009 。我已经谷歌了,但没有有意义的结果。
我在SQL 2008安装后重新启动服务(MSSQL $ SQLExpress)以确保。
这是奇怪的部分。如果我在运行引导程序之前运行SQL Server 2008安装,它可以正常工作。我没有做任何特别的事情,我只是安装它(没有重启等)。
此外,如果计算机中已安装SQL 2008,则引导程序将跳过SQL 2008的安装并直接进入数据库初始化。在这种情况下,DB将成功初始化。
有关如何进行的任何建议?
修改
进一步研究后,我发现了这个:
命令解释器(命令提示符)在a时设置ERRORLEVEL 9009 批量尝试执行未找到的程序。
那么,为什么没有找到SQLCMD?顺便说一下,我在批处理文件中调用SQLCMD命令,如下所示:
SQLCMD -S <> -E -I <>
答案 0 :(得分:1)
最后,问题在于,当一个进程产生时,环境变量的副本会被“加载”。如果在任何时候更改了此环境变量的值,则不会更新加载到进程的“副本”。
就我而言,安装SQL安装程序时,它会将其bin路径附加到%PATH%变量:
C:\ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \
但是,在引导程序中加载的%PATH%的值没有此路径,这就是批处理文件在调用“sqlcmd”时返回错误级别9009(程序未找到)的原因。
要解决这个问题,我需要在每个组件安装开始之前以某种方式“刷新”%PATH%环境变量的值。我用这段代码做了这个:
internal static void RefreshEnvironmentVariable(string variable)
{
string latestMachineValue = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);
Environment.SetEnvironmentVariable(variable, latestMachineValue, EnvironmentVariableTarget.Process);
}