powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как средствами T-SQL определить , что linked server доступен ?
19 сообщений из 19, страница 1 из 1
Как средствами T-SQL определить , что linked server доступен ?
    #32028607
Gregory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторно пытаюсь выяснить, может кто подскажет дельное... Задача простая :
- имеется linked server определенный на моем сервере (SQL Server 2000) ;
- по его имени я определяю, что соответствующий КОМПЬЮТЕР в сети;
- однако, если на том компьютере НЕ ЗАПУЩЕН SQL Server или MSDE, любой запрос к нему с моего сервера, есссно, обваливается.
Печальней всего, что при этом не формируется значение @@error !! А если вызов где-то глубоко по стеку вложенных процедур, то обваливается так весь стек ! Как все-таки заставить SQL формировать "нормальный" ответ. И нет ли какого-то средства ( хранимой процедуры ) выполняющей определение доступности linked server'а.
На всякий случай - работаю в домейне W2K, SQL Server (RTM) 8.00.194, MDTC запущен. В BOL , увы, ничего не нашел. Плохо искал ?
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32028625
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Утилита odbcping
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32028633
Gregory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Glory : Большое спасибо !
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32028697
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gregory
как вы по имени определяете, что соответствующий КОМПЬЮТЕР в сети?
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32028720
Gregory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю на него PING по имени компьютера. Результаты кладу во временную таблицу и анализирую ее содержание.
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32028856
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gregory
Если не сложно можно пример кода, я пробовал через xp_cmdshell 'ping 192.192.192.192', результат вижу, но как его в таблицу засунуть на ходу не знаю.
И второе если механизм проверки link server'а чемто вроде:
select * from linkedserver.master.dbo.table
if @@error!=0
begin
select * from master.dbo.dublikattable
end
потому-что xp_cmdshell 'ping 192.192.192.192' выполняется 3 секунды, а хотелось бы проверить наличие почти мгновенно.
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029094
Gregory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Александр Третьяков
1). "пример кода" :
...
CREATE TABLE #TBLPING ([idx] [int] IDENTITY (1,1) NOT NULL,
[val] [varchar] (8000) NULL )
set @rabStr='PING ' + @LinkServer
INSERT INTO #TBLPING (val) EXEC master..xp_cmdshell @Val = @rabStr
if exists(SELECT * FROM #TBLPING WHERE val LIKE '%Unknown host %')
set @message='Нет связи с linked server"ом '
else
begin
Delete #TBLPING
set @rabStr='ODBCPING /S' + @LinkServer+' /Usa '
INSERT INTO #TBLPING (val) EXEC master..xp_cmdshell @Val = @rabStr
if exists(SELECT * FROM #TBLPING WHERE val LIKE '%COULD NOT CONNECT TO SQL SERVER%')
set @message='Linked server не отзывается.'
else ...
и не забыть в конце
drop table #TBLPING

2)."И второе если механизм проверки link server'а чемто вроде:
select * from linkedserver.master.dbo.table ..."
У меня подобное шло около 23 секунд и кончалось обвалом процедуры, в которой подобным образом действовал. Прекращалась обработка всего стека процедур над ней ! И никакой ошибки @@error не возвращалось.
Насчет "мгновенно" - большие сормнения , а время обработки соответствующих команд в сети и время реакции на поиск и ответ SQL Server куда может подеваться ?
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029401
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gregory Спасибо за примеры кода,
но я вот думаю и мечтаю открываю Enterprise Manager и вижу как плавно загораються зеленые уголки около связаные серверов, и посещяють меня мысли как это ОН делает?, я тоже так хочу.
А если без шуток должон быть механизм какой то готовый, мы не первые.
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029410
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому-что xp_cmdshell 'ping 192.192.192.192' выполняется 3 секунды, а хотелось бы проверить наличие почти мгновенно.

IMHO в данном случае больше время тратится на загрузку command.com и затем на возврат вывода выполненных команд. Если вы напишите расширенную хранимую процедуру, то думую, что время выполнения будет почти "мгновенным"
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029415
bik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Небольшая поправка

MS SQL Server 2000 запускает cmd.exe, если работает на Windows NT/2000,
и cmdwrap.exe в противном случае (а он, cmdwrap.exe, вызывает command.com).

Что касается Ping, то именно он и "съедает" 3 секунды, т.к. времена,
затрачиваемые на сетевые коммуникации самые большие.

Если бы 3 сек уходило на загрузку командного интерпретатора и возврат
вывода выполненных команд, то любой вызов xp_cmdshell требовал
бы нескольких секунд...
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029534
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory и bik_ я думаю проблема, если можно ее назвать так, заключена в двух:
1. время потраченое на загрузку command.com (не очень большое xp_cmdshell 'dir c:\*.*' работает неплохо, но можно переделать)
2. время потраченое на ping, даже и под командной строки тратиться порядка 3с, именно здесь задержка.
Нужен механизм "мгновенной проверки", механизм в отличие от ping не проверяющий прохождение пакетов указаной длины 3 раза. Я понимаю сеть это узкое место, но ... надо как то с этим бороться. Выход должен быть всегда. Glory я не исключаю возможности написать новою разширеную хранимую процедуру, но с помощью какого механизма, как сделать мгновенный ping?
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029536
bik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Александр Третьяков:

Сорри, но твой последний пост я не могу даже комментировать...

Может это облегчит жизнь народу:

code:ping -n 1 MyHost
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029808
bik_ я понимаю, что можно уменьшить количество проверок до одной и можно уменьшить размер пакета, но ... . Когда мы открываем Enterprise Manager, то зеленые квадратики возле серверов загораються очень даже быстро (у меня сервера разбросаны по городу и скорость между ними 144кб), посоветуюсь на досуге с сетевиками и если что надумаю напишу сюда. Попробую сделать что-то вроде:
if existsserver('192.168.1.1')
begin
select * from [192.168.1.1].master.dbo.table
end
else
begin
select * from master.dbo.tabledublicat
end
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029812
bik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Алекандр Третьяков:

Когда мы открываем Enterprise Manager, то зеленые квадратики возле серверов загораються очень даже быстро (у меня сервера разбросаны по городу и скорость между ними 144кб), посоветуюсь на досуге с сетевиками и если что надумаю напишу сюда.

EM "рисует зеленые квадратики" тогда, когда ему удается опросить удаленный сервер по SMB на предмет того,
что сервис MSSQLServer запущен. Кроме того, еще EM пытается опросить удаленный сервис "SQL Listener" что слушает на UDP 1434
и возвращает описание сервера (то же, что делают isql -L, sqlping и т.п.). Так вот, чтобы тебе все это сделать, придется:

1. НаписАть Extended Stored Procedure, которая бы опрашивала удаленную машину на предмет того, запущен ли сервис MSSQLServer
2. Открыть SMB порты для этого (они, судя по всему уже открыты ), что плохо для security


Либо пытаться соединиться с удаленным сервером. Этот способ самый правильный. Завтра приведу
пример кода для такой процедуры.
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029824
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bik_ я буду благодарен за пример кода, и если можно подробнее про SMB порты?
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029991
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может пригодится...
<a>http://www.sqlmag.com/Articles/Index.cfm?ArticleID=14327&action=showfaq</a>

Q. How can I list all available SQL Servers in my application?

A. Two methods :-

1. The ISQL and OSQL commands have a -L option to list servers. This can then be run from xp_cmdshell.

Exec master..xp_cmdshell 'ISQL -L'
Exec master..xp_cmdshell 'OSQL -L'


2. Use SQL-DMO. The method/api is ListAvailableSQLServers. This returns a NameList object enumerating network-visible SQL Servers.

Details on DMO are provided in the Books-Online and/or a separate help file. These are installed as part of any SQL Server install.

A detailed example is below :-

To enumerate all network-visible SQL servers using SQL-DMO objects, create a new standard EXE project and add a reference to sqldmo.rll. This file can be found in \Binn\Resources\1033\sqldmo.rll under the SqlServer70
directory.

Now add this code and declaration in your form's code:

Private Function GetAllSqlServerCollection(colSqlServers As Collection)
As
Boolean
Dim intIndex As Integer
Dim oApplication As SQLDMO.Application
Dim oNameList As SQLDMO.NameList

Set oApplication = New Application
With oApplication
Set oNameList = .ListAvailableSQLServers
With oNameList
For intIndex = 1 To .Count
colSqlServers.Add (oNameList.Item(intIndex))
Next
End With
End With
Set oApplication = Nothing
GetAllSqlServerCollection = True
End Function

This code quickly fetches a list of SQL servers and can be put inside a combo box's drop-down event to always get a refreshed list of SQL servers on your form.
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32029995
Фотография RatTail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, забыл аттрибут HREF указать...
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32030029
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ RatTai, будем пробовать.
Есть еще одна проблемка, определили что linked server доступен, начали качать данные(нужно на перекачку 3 секунды), через 1.5 секунды канал упал (обрыв связи), SQL Server начинает мутить около 15-20 секунд, аж потом говорит, что все. @error=0, ошибки нет , и мутит долго.
Общался с сетевиками говорят: а) мгновенных проверок не бывает; б) особенно при нестабильных каналах. Короче пробую и проверяю. Еще раз спасибо RatTai.
...
Рейтинг: 0 / 0
Как средствами T-SQL определить , что linked server доступен ?
    #32030281
LYNX_DBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно еще вот такую процедульку использовать (базируется на вызове SQLDMO из T-SQL в sql7 работает в 2000 не проверял.
Если сервер присутствует - ответ получается быстро - если нет - то таймаут. Тут уж ничего не попишешь).

CREATE PROCEDURE [sp_storage_test_connection]
@srv_name varchar(255),
@login varchar(255),
@password varchar(255),
@ret varchar(255) OUT

AS
BEGIN
declare @object int
declare @hr int

select @ret = 'False'
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT
EXEC @hr = sp_OAMethod @object, 'Connect', NULL, @srv_name, @login, @password
EXEC @hr = sp_OAMethod @object, 'VerifyConnection', @ret OUT
EXEC @hr = sp_OADestroy @object

END
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как средствами T-SQL определить , что linked server доступен ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]