Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Получаю скрипт создания таблицы (начало):
DECLARE @SQLDMO INT, @DBINT INT

EXEC sp_OACreate 'SQLDMO.SQLServer', @SQLDMO OUT
EXEC sp_OASetProperty @SQLDMO, 'LoginSecure ', 'TRUE' 
EXEC sp_OAMethod @SQLDMO, 'Connect(".")'

EXEC sp_OAMethod @SQLDMO, 'Databases', @DBINT OUT, 'DATD', 'dbo'
SELECT @DBINT

значение @DBINT получаю NULL. До сегодня всё работало нормально. После того как я запустил пакетом создание около сотни однотипных таблиц, перестало работать. В чём может быть причина? Большое спасибо!
27 янв 16, 17:44    [18736978]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
После того как я запустил пакетом создание около сотни однотипных таблиц, перестало работать.

А вы ошибки предыдущих команд проверяете ?
Например, что соединение создано ?
27 янв 16, 17:47    [18736992]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Glory
А вы ошибки предыдущих команд проверяете ?
Например, что соединение создано ?

Так оно и есть:
DECLARE @SQLDMO INT, @DBINT INT, @ERROR INT

EXEC sp_OACreate 'SQLDMO.SQLServer', @SQLDMO OUT
EXEC sp_OASetProperty @SQLDMO, 'LoginSecure ', 'TRUE' 
EXEC @ERROR = sp_OAMethod @SQLDMO, 'Connect(".")'
SELECT @ERROR

возвращает 0. А какие могут быть причини даной проблемы?
27 янв 16, 18:00    [18737040]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
А какие могут быть причини даной проблемы?

Для этого получают и читают сообщение об ошибке.
27 янв 16, 18:01    [18737047]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Glory
Для этого получают и читают сообщение об ошибке.

Пробую вот так:
DECLARE @SQLDMO INT, @DBINT INT, @ERROR int, @SOURCE varchar(8000), @DESCRIPTION varchar(8000)

EXEC sp_OACreate 'SQLDMO.SQLServer', @SQLDMO OUT
EXEC sp_OASetProperty @SQLDMO, 'LoginSecure ', 'TRUE' 
EXEC @ERROR = sp_OAMethod @SQLDMO, 'Connect(".")'
IF @ERROR <> 0 BEGIN
	EXEC sp_OAGetErrorInfo @SQLDMO, @SOURCE OUTPUT, @DESCRIPTION OUTPUT
	PRINT ISNULL(@SOURCE,'')+', '+ ISNULL(@DESCRIPTION,'')
END
EXEC @ERROR = sp_OAMethod @SQLDMO, 'Databases', @DBINT OUT, 'DATD', 'dbo'
IF @ERROR <> 0 BEGIN
	EXEC sp_OAGetErrorInfo @SQLDMO, @SOURCE OUTPUT, @DESCRIPTION OUTPUT
	PRINT ISNULL(@SOURCE,'')+', '+ ISNULL(@DESCRIPTION,'')
END

получаю ошибку после "sp_OAMethod @SQLDMO, 'Databases', @DBINT OUT, 'DATD', 'dbo'":
Microsoft SQL-DMO, [SQL-DMO]This server object is not connected.
27 янв 16, 18:29    [18737166]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Помогите пожалуйста разобраться, почему попытка чтения списка баз данных завершается ошибкой?
EXEC @ERROR = sp_OAMethod @SQLDMO, 'Databases', @DBINT OUT, @DB, 'dbo'
IF @ERROR <> 0 BEGIN
	RAISERROR('Ошибка чтения списка баз данных.',16,1)
	RETURN 0
END
28 янв 16, 11:39    [18739330]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
почему попытка чтения списка баз данных завершается ошибкой?

На написано же почему - This server object is not connected.
Как вы себе представляете чтение списка баз без соединения ?
28 янв 16, 12:06    [18739495]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Можно как-то перегрузить SQL-DMO server?
28 янв 16, 12:37    [18739663]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
Можно как-то перегрузить SQL-DMO server?

SQL-DMO - это не сервер. Его нельяз перегрузить
28 янв 16, 12:38    [18739675]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
После перезагрузки сервера Windows Server 2003 R2 Standard x64 Edition SP2 всё заработало. Жалко конечно что причина ошибки не известна.
28 янв 16, 16:51    [18741343]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
Жалко конечно что причина ошибки не известна.

Наверное в том, что вы 100 раз создаете объекты сервер, коннект и тд ?
И не закрываете их ?
28 янв 16, 16:53    [18741356]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Glory
Наверное в том, что вы 100 раз создаете объекты сервер, коннект и тд ?
И не закрываете их ?

Вы совершенно правы! После каждого выполнения скрипта коннект не закрывался и получалось накопление открытых коннектов. При этом в списке процессов можно видеть кучу процессов где Application= SQLDMO_1, SQLDMO_2...SQLDMO_353. На будущее, ситуацию исправил, дописал закрытие коннекта:
EXEC sp_OAMethod @SQLDMO, 'DisConnect'
EXEC sp_OADestroy @DBINT
EXEC sp_OADestroy @TABLEINT
EXEC sp_OADestroy @SQLDMO

а как счас закрыть все накопленные коннекты?
29 янв 16, 11:38    [18744572]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
Вы совершенно правы! После каждого выполнения скрипта коннект не закрывался и получалось накопление открытых коннектов. При этом в списке процессов можно видеть кучу процессов где Application= SQLDMO_1, SQLDMO_2...SQLDMO_353. На будущее, ситуацию исправил, дописал закрытие коннекта:

Вообще-то для всех манипуляций по созданию объектов достаточно ОДИН раз создать коннект

shanton
а как счас закрыть все накопленные коннекты?

kill <session ID>
29 янв 16, 11:41    [18744599]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Закрываю соединение в процедуре:
CREATE PROCEDURE [dbo].[dmo_tables_GetScript]
	@DB VARCHAR(128),
	@TABLE VARCHAR(128),
	@SP	 VARCHAR(8000) OUTPUT
AS
DECLARE @SQLDMO INT
	, @DBINT INT
	, @TABLEINT INT
	, @ERROR INT
	, @ERRORMSG VARCHAR(100)
EXEC @ERROR = sp_OACreate 'SQLDMO.SQLServer', @SQLDMO OUT
IF @ERROR <> 0 BEGIN
	RAISERROR('Ошибка создания объекта SQLServer.',16,1)
	RETURN 0
END
EXEC @ERROR = sp_OASetProperty @SQLDMO, 'LoginSecure ', 'TRUE' 
IF @ERROR <> 0 BEGIN
	RAISERROR('Ошибка установки свойства LoginSecure объекта SQLServer в значение TRUE.',16,1)
	RETURN 0
END
EXEC @ERROR = sp_OAMethod @SQLDMO, 'Connect(".")'
IF @ERROR <> 0 BEGIN
	RAISERROR('Ошибка установки доверенного соединения с SQLServer.',16,1)
	RETURN 0
END
EXEC @ERROR = sp_OAMethod @SQLDMO, 'Databases', @DBINT OUT, @DB, 'dbo'
IF @ERROR <> 0 BEGIN
	RAISERROR('Ошибка чтения списка баз данных.',16,1)
	RETURN 0
END
EXEC @ERROR = sp_OAMethod @DBINT, 'Tables', @TABLEINT OUT, @TABLE, 'dbo'
IF @ERROR <> 0 BEGIN
	SET @ERRORMSG='"'+@TABLE+'" не является таблицей.'
	RAISERROR(@ERRORMSG,16,1)
	RETURN 0
END
EXEC @ERROR = sp_OAMethod @TABLEINT, 'Script', @SP OUT
IF @ERROR <> 0 BEGIN
	RAISERROR('Ошибка чтения скрипта.',16,1)
	RETURN 0
END
EXEC sp_OAMethod @SQLDMO, 'DisConnect'
EXEC sp_OADestroy @DBINT
EXEC sp_OADestroy @TABLEINT
EXEC sp_OADestroy @SQLDMO

и всёравно, неоднократное её выполнение призводит к ошибке 'Ошибка чтения списка баз данных.', тоесть невозможно создать новое соединение. Что я неправельно делаю? И как мне счас очистить накопленные соединения? В процессах я их уже не вижу, тоесть "kill <session ID>" уже не проходит. Можно конечно рестарт сервера сделать, но может есть какие-то варианты?
2 фев 16, 10:10    [18760002]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
В процессах я их уже не вижу, тоесть "kill <session ID>" уже не проходит.

Значит соединений нет

shanton
Можно конечно рестарт сервера сделать, но может есть какие-то варианты?

Не использовть sp_OA

Сообщение было отредактировано: 2 фев 16, 10:13
2 фев 16, 10:12    [18760012]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Glory
Не использовть sp_OA

А что можите посоветовать вместо sp_OA, для форимирования скриптов создания обьектов БД?
2 фев 16, 13:53    [18761858]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
shanton
А что можите посоветовать вместо sp_OA, для форимирования скриптов создания обьектов БД?


powershell / linked server/ t-sql
вариантов масса
2 фев 16, 13:56    [18761876]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
shanton
А что можите посоветовать вместо sp_OA, для форимирования скриптов создания обьектов БД?

любую внешную утилиту - хоть свою, хоть уже кем-то написанную
2 фев 16, 13:56    [18761879]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
shanton
А что можите посоветовать вместо sp_OA, для форимирования скриптов создания обьектов БД?


powershell / linked server/ t-sql
вариантов масса

а еще можно набрать в поиске по форуму - скрипт БД программно и получиться сразу готовые болванки под разные версии mssql
2 фев 16, 13:57    [18761889]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Maxx
а еще можно набрать в поиске по форуму - скрипт БД программно и получиться сразу готовые болванки под разные версии mssql

Я так и вишел на sp_OA в своё время.
2 фев 16, 14:00    [18761905]     Ответить | Цитировать Сообщить модератору
 Re: При получении скрипта создания таблицы sp_OAMethod возвращает NULL  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
shanton
Я так и вишел на sp_OA в своё время.

ну вам тоді непощастило :) Вы итоге вы выбрали самый "неудобный" вариант
2 фев 16, 14:08    [18761961]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить