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

Откуда:
Сообщений: 5
Доброго дня, господа специалисты. В инете нашел два запроса, которые позволяют определить размер таблиц ИБ.
Вот первый:
ТекстЗапросаSQL = "declare @t table (name varchar(255), [rows] varchar(255), reserved varchar(255), data varchar(255), index_size varchar(255), unused varchar(255))
|delete from @t
|insert into @t exec sp_MSforeachtable @command1='EXEC sp_spaceused ''?''',@whereand='or OBJECTPROPERTY(o.id, N''IsSystemTable'') = 1'
|select name as name, rows as rows, reserved as reserved, data as data, index_size as index_size, unused as unused from @t order by CONVERT(bigint,REPLACE(data,' KB','')) DESC";

Вот второй:
ТекстЗапросаSQL = "select t.name as TableName, Min(t.create_date) as CreateDate, ds.name as FileGroupName, SUM(u.total_pages) * 8 / 1024 as SizeMB
|from sys.tables as t
|inner join sys.partitions as p on t.object_id = p.object_id
|inner join sys.allocation_units as u on p.partition_id = u.container_id
|inner join sys.data_spaces as ds on u.data_space_id = ds.data_space_id
|group by t.name, ds.name
|order by SizeMB desc";

Вот код выполнения запроса из 1С:

Connection = Новый COMОбъект("ADODB.Connection");
RecordSet = Новый COMОбъект("ADODB.RecordSet");

Попытка

Connection.Open("Provider=SQLOLEDB.1;Persist Security Info=False;User ID="+ИмяПользователя+";Password="+Пароль+"; Initial Catalog="+ИмяБазыДанных+";Data Source="+ИмяСервера);

Исключение

Сообщить(ОписаниеОшибки());
Возврат Новый ТабличныйДокумент;

КонецПопытки;

RecordSet.Open(ТекстЗапросаSQL, Connection, 1);

RecordSet.MoveFirst();
Пока RecordSet.EOF() = 0 Цикл
СтрокаТаблицыБазыДанных.name=RecordSet.Fields("name").Value;


Второй запросы выполняется нормально, первый же валится на такой ошибке:
{ВнешняяОбработка.РазмерТаблицБазыДанных.МодульОбъекта(45)}: Ошибка при вызове метода контекста (MoveFirst)
RecordSet.MoveFirst();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.

Если эти запросы выполнять в SQL - то все работает.
Где я что упустил?
19 май 14, 09:37    [16034944]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
@whereand='or OBJECTPROPERTY(o.id, N''IsSystemTable'') = 1 уберите.
19 май 14, 10:06    [16035053]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
spezc,

автор
Если эти запросы выполнять в SQL - то все работает.
Где я что упустил?


в первом запросе добавить в начало set nocount on. Иначе insert, update, delete при выполнении генерируют служебные сообщения, которые приводят к возникновению дополнительных неоткрытых (см ADODB.Recordset.Status) наборов данных ADODB.Recordset.
Бывает, что set nocount on не помогает. Тогда приходится после открытия листать ADODB.Recordset с помощью .NextRecordset (Rs=Rs.NextRecordset) пока
ADODB.Recordset.Status= (-1, кажется)
19 май 14, 10:18    [16035095]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
spezc
Member

Откуда:
Сообщений: 5
invm,

убрал,
получился такой запрос:
ТекстЗапросаSQL = "declare @t table (name varchar(255), [rows] varchar(255), reserved varchar(255), data varchar(255), index_size varchar(255), unused varchar(255))
|delete from @t
|insert into @t exec sp_MSforeachtable @command1='EXEC sp_spaceused ''?''','
|select name as name, rows as rows, reserved as reserved, data as data, index_size as index_size, unused as unused from @t order by CONVERT(bigint,REPLACE(data,' KB','')) DESC";

ругается на "Неправильный синтаксис около конструкции "KB"."
подозреваю, что дело в оставшемся ,' после 'EXEC sp_spaceused ''?'''. убрал и это - ошибка что и в самом начале
19 май 14, 10:21    [16035101]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
icprog
Member

Откуда:
Сообщений: 166
spezc,

Лишняя скобка?
19 май 14, 10:24    [16035109]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
icprog
Member

Откуда:
Сообщений: 166
icprog
spezc,

Лишняя скобка?

Хотя нет :(
19 май 14, 10:25    [16035110]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
spezc
Member

Откуда:
Сообщений: 5
Всем большое спасибо за подсказки, особенно VladimirKr, помогло)
19 май 14, 10:26    [16035113]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
icprog
Member

Откуда:
Сообщений: 166
icprog,

кавычка в конце строки
insert into @t exec sp_MSforeachtable @command1='EXEC sp_spaceused ''?''','
19 май 14, 10:26    [16035116]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
spezc
Member

Откуда:
Сообщений: 5
и можно еще вопрос не по теме? у меня запрос возвращает размер в виде "1231324 КВ", а как убрать это КВ? Как я понимаю это КВ специально добавляется в запросе - а вот как это убрать грамотно?
19 май 14, 10:27    [16035121]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
icprog
Member

Откуда:
Сообщений: 166
spezc,

substring(ИмяПоля,1,len(ИмяПоля-3))
19 май 14, 10:49    [16035197]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к базе SQL из 1C. Один запрос работает, другой нет.  [new]
spezc
Member

Откуда:
Сообщений: 5
Благодарю за помощь!
19 май 14, 10:50    [16035203]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить