我正在创建一个代码库,该代码库将部署在企业环境中的数十个 Sql Server 上。 SQL Server 的版本大多为 2008,但也存在一些 2000、2005 和 2008R2 实例。它们也在 Windows Server 2000-2008 的各种版本上运行。我需要能够找到要从此库中的 C#.NET 代码中调用的 BCP 的 Sql Server 版本。
我不能依赖默认安装目录,因为许多服务器没有在默认目录位置安装 Sql Server。
我也不能依赖 PATH 变量,因为许多服务器还安装了 Sybase 驱动程序,该驱动程序有自己的 BCP 版本(它不支持我们使用的许多 BCP 调用的 queryout 命令),并且我们已经依赖 PATH 环境变量返回 Sybase 位置而不是 Sql Server 位置时出现问题。
任何人都可以提出一个解决方案,让我在考虑到不同的版本和约束的情况下轻松找到这些服务器上的 BCP 位置吗?
编辑:
我曾考虑过使用 SQLBulkCopy,但这是为了支持跨多个数据库和存储过程的大量现有 BCP 调用。现在,它们都调用现有的存储过程,该存储过程存在于每个服务器上的公共数据库中,并且在该存储过程中,模拟调用然后使用其提升的权限来调用 xp_cmdshell。出于安全原因,我们希望删除 xp_cmdshell 部分。我们希望将其替换为 CLR 存储过程,该存储过程会查找 BCP,然后传入参数,以便其他人无法轻松地使用该进程来访问 cmd shell。
BULK INSERT 在我们的环境中也不起作用,因为安全权限的设置方式很奇怪,而且出于某种原因,他们还没有弄清楚,BCP 无法处理不在同一物理盒子上的文件位置。另外,我们的大多数 BCP 调用都是创建文件,而不是导入文件。
想法...
这么说,就可以找到路径了
当然,您的调用帐户需要 SQL 权限或远程读取注册表的权限。使用SQL意味着使用SQL服务帐户可以看到它自己的注册表项
Google 上也有很多“查找 SQL Server 安装路径”的结果(我在上面选择了两个)
您能在服务器注册表中找到您需要的大部分内容吗?
我知道以下注册表路径包含大量信息,包括路径和版本。
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\
或在 64 位系统上:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
有关 Wow6432Node 的信息,请参阅 这个问题
对于我安装的 SQL Server 2022,BCP 的路径是:
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\bcp.exe