Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
Пытаюсь получить информацию по дискам с разных серверов в job'е. Сначала написал через ActiveX
(Вспомогательный код опускаю)

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
"root\CIMV2", strUser, strPassword, "MS_409", "ntlmdomain:" + strDomain)

Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3",,48)

Job работает пока не сам не остановишь.
Переписал на T-SQL
EXEC @HR = sp_OACreate N'WbemScripting.SWbemLocator',
@Obj_SWbemLocator OUT;

EXEC @HR = sp_OAMethod @Obj_SWbemLocator, 'ConnectServer', @Obj_WMIService OUT, '10.10.10.10', 'root\CIMV2', 'user', 'pass', 'MS_409', 'ntlmdomain:domain'

EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', @Obj_WMI_RecordSet OUT, 'SELECT Size FROM Win32_LogicalDisk WHERE DriveType = 3

До сюда все тихо и спокойно, а вот все попытки получить массив данных ни к чему не привели. В BOL написано, что 2-мерный массив проверяется и данные сопоставляются родным типам данных, а как получить искомый рекордсет я все равно не понял.
У кого есть правильная подсказка? Благодарю заранее
30 сен 06, 23:23    [3207019]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
а вот все попытки получить массив данных ни к чему не привели.
create table #x(...)
insert #x
EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', NULL, 'SELECT Size FROM Win32_LogicalDisk WHERE DriveType = 3'
2 окт 06, 11:16    [3209196]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
To: Glory
Получается следующее:
-Если выходной параметр ставим NULL,
insert x
EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', NULL, 'SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3'
то получаем
Msg 0, Level 11, State 0, Line 0
При выполнении текущей команды возникла серьезная ошибка.. При наличии результатов они должны быть аннулированы.
-Если присваем выходному параметру переменную @Obj_WMI_RecordSet
insert x
EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', @Obj_WMI_RecordSet, 'SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3'
то ничего соответственно в таблицу не заносится. Кто-нибудь сталкивался?
2 окт 06, 12:50    [3209864]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
Никто ничего подобного не делал? Хелп плиз, надо очень!
2 окт 06, 16:56    [3211644]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
pand97
Guest
может быть проще все это сделать в WMI, не перенося в t-sql?
или есть какие-то причины делать все это на t-sql?
2 окт 06, 17:38    [3211972]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
AndreyBD

insert x
EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', @Obj_WMI_RecordSet, 'SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3'
то ничего соответственно в таблицу не заносится. Кто-нибудь сталкивался?

Ну а просто
EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', @Obj_WMI_RecordSet, 'SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3'
возвращает что-нибудь ?
2 окт 06, 17:41    [3211988]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
Тут весь прикол в том, что если результатом запроса будет двумерный массив, то клиенту возвращается рекордсет (BOL). Попытки присвоить @Obj_WMI_RecordSet различные типы данных ни к чему не привели. Я здесь этот момент не очень понимаю если честно.
2 окт 06, 17:57    [3212105]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
pand97
Guest
а коннект правильно проходит?
после установки коннекта в @Obj_WMIService - есть что-нибудь
может правов не хватает у sql?
2 окт 06, 18:09    [3212148]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
AndreyBD
Тут весь прикол в том, что если результатом запроса будет двумерный массив, то клиенту возвращается рекордсет (BOL). Попытки присвоить @Obj_WMI_RecordSet различные типы данных ни к чему не привели. Я здесь этот момент не очень понимаю если честно.

I don't think Glory asked you to quote the BOL... Are you getting recordset (for ex. in job step's log file or in QA) or not?
2 окт 06, 18:15    [3212167]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to: pand97
Соединение идет с паролем админа, прав однозначно хватает. Да и во время отладки обработка ошибок выдавала по синтаксису сообщения.

to:BugsBunny
Да ни откуда у меня не получилось (на T-SQL). На VBScripte все нормально если снаружи пускать, а из job'а - застывает.
2 окт 06, 18:34    [3212244]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
AndreyBD
...а из job'а - застывает.

do you know what statement in particular? I'm asking because here they mention "hanging indefinitely" situation

SWbemLocator.ConnectServer
iSecurityFlags
[in, optional] Used to pass flag values to ConnectServer.
Flag/value Meaning
0 / 0x0 A value of 0 for this parameter causes the call to ConnectServer to return only after the connection to the server is established. This could cause your program to hang indefinitely if the connection cannot be established.
wbemConnectFlagUseMaxWait / 128 / 0x80 The ConnectServer call is guaranteed to return in 2 minutes or less. Use this flag to prevent your program from hanging indefinitely if the connection cannot be established.
2 окт 06, 19:10    [3212404]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to:BugsBunny
спасибо за мысль, беру таймаут. Завтра проверю
2 окт 06, 19:21    [3212433]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
BugsBunny
Member

Откуда: GMT+5=EST
Сообщений: 2414
though personally I think this leads you nowhere.
objWMIService.ExecQuery returns a collection - not a recordset. My attempts to handle mentioned output (in VBScript) as recordset failed with following errors:

cmd
...
C:\WMI.vbs(26, 1) Microsoft VBScript runtime error: Object doesn't support this property or method: 'rs.eof'
...
C:\WMI.vbs(25, 1) Microsoft VBScript runtime error: Object doesn't support this property or method: 'rs.movenext'
...
C:\WMI.vbs(28, 2) Microsoft VBScript runtime error: Object doesn't support this property or method: 'rs.Fields'

That's why I would use regular xp_cmdshell 'cscript my_wmi.vbs my_server my_user my_pwd my_output.txt' , where my_wmi.vbs dumps(append) results into text file for each server and then bulkinsert it(file).
2 окт 06, 20:57    [3212597]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to:BugsBunny
Насчет рекордсета это мы немного в терминах запутались. Я рассматривал с точки зрения терминовBOL. Т.е. там говорилось что если результат - двумерный массив (как в нашем случае), то клиенту возвращается рекордсет. Поэтому я и вел речь о рекордсете. Интересно, может ошибка из-за того, что невозможно разобрать результат запроса?
А использовать xp_cmdshell таким образом (передача данных через внешний файл) - по моему неспортивно :-)
3 окт 06, 10:47    [3213681]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
AndreyBD
Тут весь прикол в том, что если результатом запроса будет двумерный массив, то клиенту возвращается рекордсет (BOL). Попытки присвоить @Obj_WMI_RecordSet различные типы данных ни к чему не привели. Я здесь этот момент не очень понимаю если честно.

А что тут понимать ?
При возврате массива returnvalue является просто заглушкой.

BOL - sp_OAMethod - returnvalue OUTPUT

When the method return value is an array, if returnvalue is specified, it is set to NULL.

И еще

Result Sets
If the method return value is an array with one or two dimensions, the array is returned to the client as a result set:

- A one-dimensional array is returned to the client as a single-row result set with as many columns as there are elements in the array. In other words, the array is returned as (columns).

- A two-dimensional array is returned to the client as a result set with as many columns as there are elements in the first dimension of the array and with as many rows as there are elements in the second dimension of the array. In other words, the array is returned as (columns, rows).

Т.е. результат EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', @Obj_WMI_RecordSet, 'SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType = 3'
должен восприниматься клиентом как набор данных. Вы видите этот набор в QA ?
3 окт 06, 10:54    [3213730]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to: BugsBunny
do you know what statement in particular? I'm asking because here they mention "hanging indefinitely" situation

SWbemLocator.ConnectServer
iSecurityFlags
[in, optional] Used to pass flag values to ConnectServer.
Flag/value Meaning
0 / 0x0 A value of 0 for this parameter causes the call to ConnectServer to return only after the connection to the server is established. This could cause your program to hang indefinitely if the connection cannot be established.
wbemConnectFlagUseMaxWait / 128 / 0x80 The ConnectServer call is guaranteed to return in 2 minutes or less. Use this flag to prevent your program from hanging indefinitely if the connection cannot be established.

Короче не влияет этот параметр на поведение запускаемых ActiveX и T-SQL(здесь вообще сообщение о неправильны параметре)
3 окт 06, 11:31    [3214049]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to:Glory
EXEC @HR = sp_OAMethod @Obj_WMIService, 'ExecQuery', @Obj_WMI_RecordSet OUT, 'SELECT Name, Size, FreeSpace FROM Win32_LogicalDisk WHERE DriveType=3'
получаем
Command(s) completed successfully.
3 окт 06, 13:07    [3214706]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
Хмм. А в @Obj_WMI_RecordSet что после этого ?
3 окт 06, 13:08    [3214713]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to: Glory
returnvalue OUTPUT
Is the return value of the method of the OLE object. If specified, it must be a local variable of the appropriate data type.
- отпадает
If the method returns a single value, either specify a local variable for returnvalue, which returns the method return value in the local variable, or do not specify returnvalue, which returns the method return value to the client as a single-column, single-row result set.
- отпадает
If the method return value is an OLE object, returnvalue must be a local variable of data type int. An object token is stored in the local variable, and this object token can be used with other OLE Automation stored procedures.
- отпадает
When the method return value is an array, if returnvalue is specified, it is set to NULL.
Т.е. имеем NULL и все тут. Наверное. Вообщем к этому и сводится вся суть вопроса. Спасибо
3 окт 06, 13:28    [3214845]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
AndreyBD
to: Glory
returnvalue OUTPUT
Is the return value of the method of the OLE object. If specified, it must be a local variable of the appropriate data type.
- отпадает
If the method returns a single value, either specify a local variable for returnvalue, which returns the method return value in the local variable, or do not specify returnvalue, which returns the method return value to the client as a single-column, single-row result set.
- отпадает
If the method return value is an OLE object, returnvalue must be a local variable of data type int. An object token is stored in the local variable, and this object token can be used with other OLE Automation stored procedures.
- отпадает
When the method return value is an array, if returnvalue is specified, it is set to NULL.
Т.е. имеем NULL и все тут. Наверное. Вообщем к этому и сводится вся суть вопроса. Спасибо

Зачем цитировать мне хелп.
Я хочу знать, что за конкретное значение вы получили в @Obj_WMI_RecordSet
3 окт 06, 13:30    [3214864]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to:Glory
Это я все к тому, что даже не очень понимаю какой тип переменной для @Obj_WMI_RecordSet поставить. Поставил int - получил 50265854, varchar - NULL. А как вот до рекордсета добраться?
3 окт 06, 13:50    [3215004]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
AndreyBD
to:Glory
Это я все к тому, что даже не очень понимаю какой тип переменной для @Obj_WMI_RecordSet поставить. Поставил int - получил 50265854

Похоже, что вам возвращается не набор, но ссылка на него. Попробуйте извлечь что нибудь из объекта, ссылку на который вы получили
3 окт 06, 14:03    [3215109]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
А как? То что это token и так понятно. А вот каким средством обЪект получить из T-SQL? sp_OAGetProperty не катит
3 окт 06, 14:34    [3215334]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
Glory
Member

Откуда:
Сообщений: 104751
AndreyBD
А как? То что это token и так понятно. А вот каким средством обЪект получить из T-SQL? sp_OAGetProperty не катит

Почему не катит ??
Прицип ООП - важдый объект должен иметь как минимум коллекцию Proiperties с атрибутами Count, Name. Читаем в цикле все имена как минимум. А дальше уже в хелп по WMI - узнавать для чего это свойство.
3 окт 06, 14:37    [3215348]     Ответить | Цитировать Сообщить модератору
 Re: WMI в Job'e  [new]
AndreyBD
Member

Откуда:
Сообщений: 26
to: Glory
если несложно, можно кусочечек кода :-)
3 окт 06, 15:07    [3215530]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить