【问题标题】:How do I find BCP on a SQL Server?如何在 SQL Server 上找到 BCP?
【发布时间】:2011-06-17 23:14:01
【问题描述】:

我正在创建一个代码库,该代码库将部署在企业环境中的数十个 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 调用都是创建文件,而不是导入它们。

【问题讨论】:

    标签: .net sql-server bcp


    【解决方案1】:

    想法...

    • 您可以使用 .net 中的 SQLBulkCopy 吗?
    • 或者从 .net 运行 SSIS?
    • 或在 SQL 中批量插入

    这么说,你可以找到路径

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

    Google 上也有很多关于“查找 SQL 服务器的安装路径”的结果(我在上面选择了两个)

    【讨论】:

    • 我曾为新需求考虑过其中的一些长期需求,但请参阅上面对现有需求的编辑。在这一点上,注册表路径似乎是最有可能的选项。
    【解决方案2】:

    您能在服务器注册表中找到您需要的大部分内容吗?

    我知道以下注册表路径包含大量信息,包括路径和版本。

    HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\

    或在 64 位系统上:

    HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

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

    【讨论】:

    • 我在 64 位机器上,我假设 64 位机器上会有 64 位 SQL Server。因此不需要 Wow6432Node。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2017-11-30
    相关资源
    最近更新 更多