Я создаю библиотеку кода, которая будет развернута на нескольких десятках серверов Sql в корпоративной среде. Версии SQL Server в основном 2008 года, но также существуют экземпляры 2000, 2005 и 2008R2. Они также работают на различных версиях Windows Server 2000-2008. Мне нужно иметь возможность найти версию BCP для Sql Server, которая будет вызываться из кода C#.NET в этой библиотеке.
Я не могу полагаться на каталог установки по умолчанию, потому что на многих серверах Sql Server не установлен в каталогах по умолчанию.
Я также не могу полагаться на переменную PATH, потому что на многих из этих серверов также установлены драйверы Sybase, у которых есть собственная версия BCP (которая не поддерживает команду queryout, которую мы используем во многих вызовах BCP), и у нас были проблемы с опорой на переменную окружения PATH, возвращающую местоположение Sybase, а не местоположение сервера Sql.
Может ли кто-нибудь предложить решение, которое позволило бы мне легко найти местоположение BCP на этих серверах с учетом этих несопоставимых версий и ограничений?
РЕДАКТИРОВАТЬ:
Я думал об использовании SQLBulkCopy, но это для поддержки набора уже существующих вызовов BCP во множестве баз данных и хранимых процедур. Прямо сейчас все они вызывают существующую хранимую процедуру, которая существует в общей базе данных на каждом сервере, и в этой хранимой процедуре олицетворенный вызов затем использует свои повышенные привилегии для вызова xp_cmdshell. Мы хотим избавиться от части xp_cmdshell из соображений безопасности. Мы хотим заменить его хранимой процедурой CLR, которая находит BCP, а затем передает параметры, чтобы кто-то не мог использовать процесс на месте для получения доступа к оболочке cmd почти так же легко.
BULK INSERT также не работает в нашей среде из-за странного способа настройки разрешений безопасности, и по какой-то причине они еще не разобрались, BCP не может работать с местоположениями файлов, которые не находятся в одном физическом ящике. Кроме того, большинство наших вызовов BCP создают файлы, а не импортируют их.