我正在创建一个将在企业环境中跨几十个Sql Server部署的代码库。 SQL Server版本大多为2008年,但也存在一些2000年,2005年和2008R2实例。这些也运行在各种版本的Windows 2000-2008上。我需要能够找到从该库中的C#.NET代码中调用的BCP的Sql Server版本。如何在SQL Server上查找BCP?
我不能依靠默认安装目录,因为许多服务器没有安装在默认目录位置的Sql Server。
我也不能依赖PATH变量,因为许多这些服务器也安装了Sybase驱动程序,它具有它自己的BCP版本(它不支持许多我们使用的BCP调用的查询命令)和我们在依靠PATH环境变量返回Sybase位置而不是Sql Server位置时遇到了问题。
任何人都可以提出一个解决方案,让我可以很容易地找到BCP的位置跨这些服务器给出这个不同的版本和约束?
编辑:
我曾想过使用SqlBulkCopy的,但是这是支持了一堆已经存在BCP的跨数据库和存储过程的调用多种。现在他们都调用存在于每个服务器上公共数据库中的现有存储过程,并且在该存储过程中,模拟调用然后使用其提升的权限调用xp_cmdshell。出于安全原因,我们希望摆脱xp_cmdshell部分。我们想用一个CLR存储过程来替换它,它找到BCP,然后传递这些参数,以便某个人不能使用该过程就地访问cmd shell几乎一样容易。
BULK INSERT在我们的环境中也不起作用,因为设置了安全权限的奇怪方式,并且由于某些原因,他们还没有弄清楚,BCP无法使用不同的文件位置物理盒子。另外,我们的大多数BCP呼叫都是在创建文件,而不是导入它们。
我已经想到了这些长期满足新需求的几个问题,但请参阅上面对现有编辑的编辑。注册表路径似乎是目前最可能的选择。 – BBlake 2011-06-17 14:10:26