Просмотр для серверов SQL

Я пишу приложение базы данных, которое подключается к серверу SQL. Я хотел бы реализовать подобное диалоговое окно подключения, как в SQL Management Studio. Я уже нашел способ получить список баз данных на сервере, но мне бы очень хотелось получить список доступных серверов в сети, чтобы конечным пользователям не приходилось вводить имя /IP-адрес сервера,

7 ответов

Решение

Отсюда:

CREATE PROCEDURE dbo.ListLocalServers 
AS 
BEGIN 
    SET NOCOUNT ON 

    CREATE TABLE #servers(sname VARCHAR(255)) 

    INSERT #servers EXEC master..XP_CMDShell 'OSQL -L' 
    -- play with ISQL -L too, results differ slightly 

    DELETE #servers WHERE sname='Servers:' 

    SELECT LTRIM(sname) FROM #servers WHERE sname != 'NULL' 

    DROP TABLE #servers 
END

Альтернативный метод SQL DMO здесь

Ваше лучшее предположение будет заполнить список заранее, если вы можете.

Сканирование сети на наличие SQL-серверов, вероятно, не лучшая идея (медленная, ненадежная).

Если вы разрабатываете свою программу в.Net, вы можете использовать объекты SMO для этого. Используйте метод Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers, чтобы получить список всех серверов sql, работающих в вашей локальной сети.
Сканирование занимает несколько секунд, но оно не очень медленное.

Для начала можно получить монитор MS Network и посмотреть, что он делает, если щелкнуть раскрывающийся список в MSSMS.

Я предполагаю (с задержкой, когда вы нажимаете этот выпадающий список), что он опрашивает локальную сеть.

Сказав это, в моем офисе, кажется, опрашивает не только локальную сеть, поскольку она получает серверы, которые находятся внутри корпоративной сети, но в других подсетях.

Удачи

Инструмент SQLPing от sqlsecurity.com. Более старые версии загрузок содержат исходный код, который может быть полезен.

По сути, вам нужно запрашивать порт 1434 UDP на каждом IP-адресе в вашей сети. Тем не менее, брандмауэры и политики будут блокировать это.

Примечание. 1434 - это место, где вы перечисляете экземпляры SQL на сервере. Если вы используете только экземпляры по умолчанию, то порт 1433 подойдет. Если только он не "спрятан" в порту 2433...

Не уверен, что существует правильный способ, но одним из способов было бы попытаться подключиться к порту 1433 (порт mssqlserver по умолчанию) к компьютерам в вашей сети.

Возможно, SQLCMD /L будет работать для вас.

Другие вопросы по тегам