2011-06-17 78 views
0

我正在创建一个将在企业环境中跨几十个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呼叫都是在创建文件,而不是导入它们。

回答

0

思考...

  • 您可以使用SqlBulkCopy的从你的.NET?
  • 或者从.net运行SSIS?
  • 或SQL BULK INSERT

话说,你可以找到的路径

中当然,您的呼叫帐户需要使用SQL权限或远程读取注册表。使用SQL意味着使用SQL服务acount可以看到它自己的注册表项

而在谷歌的许多结果“找到安装路径为SQL Server”太(我上面摘走2)

+0

我已经想到了这些长期满足新需求的几个问题,但请参阅上面对现有编辑的编辑。注册表路径似乎是目前最可能的选择。 – BBlake 2011-06-17 14:10:26

0

你能找到大部分你需要在服务器注册表中?

我知道以下注册表路径有很多信息,包括路径和版本。

HKLM \ SOFTWARE \微软\ Microsoft SQL Server的\

或64位系统上:

HKLM \ SOFTWARE \ Wow6432Node \微软\ Microsoft SQL Server的

有关Wow6432Node的信息,请参阅this question

+0

我在一台64位的机器上,我假设一台64位的机器上会有一个64位的SQL Server。因此不需要Wow6432Node。 – 2011-06-17 17:22:36