![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скрипт объекта БД посредством SQLDMO.SQLServer [MSSQL]
Ольга © (2006-05-04 17:41:00)Скрипты на создание объектов БД получаю с помощью хранимой процедуры, которая вызывает методы SQLDMO.SQLServer. Все было здорово до тех пор, пока не встретился скрипт размером > 8000 (переменная, в которую пишется скрипт @cScript varchar(8000)) Пыталась подставить другой тип - не работает. Может что подскажете, мастера?
DECLARE @oSrv int, @oDB int, @oObj int, @cScript varchar(8000),
@Server varchar(50),@DataBase varchar(50),@TypeObject varchar(30),@NameObject varchar(50)
SET @Server = 'local'
SET @DataBase = 'ETALON'
SET @TypeObject = 'StoredProcedures'
SET @NameObject = 'DeleteFromShema'
EXEC sp_OACreate 'SQLDMO.SQLServer', @oSrv output
EXEC sp_OASetProperty @oSrv, 'LoginSecure', 'TRUE'
EXEC sp_OAMethod @oSrv, 'Connect', NULL, @Server
EXEC sp_OAGetProperty @oSrv, 'Databases', @oDB output, @DataBase
EXEC sp_OAGetProperty @oDB, @TypeObject, @oObj output, @NameObject
EXEC sp_OAMethod @oObj, 'Script', @cScript output
EXEC sp_OAMethod @oSrv, 'Disconnect'
EXEC sp_OADestroy @oSrv
SELECT @cScript
Nikolay M. (2006-05-06 12:27:00) [1]
> Да, клиент будет не такой тонкий, как хотелось бы. Но что
> поделаешь - за все надо платить. Одно радует - таких клиентов
> (админов) будет 1-2 на контору.
Админам можно и целиком клиентскую часть SQL Server установить.
Если все-таки решите ставить только SQL-DMO, советую изучить чужой опыт
http://www.sql.ru/forum/actualthread.aspx?tid=45114
Ольга (2006-05-06 12:15:00) [2]Спасибо, заработало!
> И если это планируется делать на клиентских компьютерах,
> не забудьте, что я говорил о переносе SQL-DMO.
Да, клиент будет не такой тонкий, как хотелось бы. Но что поделаешь - за все надо платить. Одно радует - таких клиентов (админов) будет 1-2 на контору. Еще раз спасибо.
Nikolay M. (2006-05-06 10:45:00) [3]И если это планируется делать на клиентских компьютерах, не забудьте, что я говорил о переносе SQL-DMO.
Nikolay M. (2006-05-06 10:41:00) [4]
procedure TForm1.Button1Click(Sender: TObject);
var
srv, db : OleVariant;
begin
srv := CreateOleObject ('SQLDMO.SQLServer');
srv.LoginSecure := False;
srv.Connect('srv', 'login', 'pass');
db := srv.Databases.Item ('Northwind');
ShowMessage (db.StoredProcedures.Item ('Sales by Year', 'dbo').Script);
end;
Ольга (2006-05-06 10:13:00) [5]Пытаюсь перевести свой код с T-SQL на Дельфи, не получается. В help-e есть примеры использования SQLDMO на VB6 и С, никак не могу угадать синтаксис для Дельфи. Торможу уже на соединении с базой. Черкните хотя еще пару строк - дальше соображу сама. Привожу код с закоментариными своими попытками (чтобы дурь была видна):
procedure TForm1.Button1Click(Sender: TObject);
var srv, db, sp : OleVariant; scr: string;
begin
try
srv := CreateOleObject ('SQLDMO.SQLServer');
srv.LoginSecure:=True;
srv.Connect('BRSQL');
//db:=srv.Databases('ETALON');
//db:= CreateOleObject ('SQLDMO.Database');
//db.Name:='ETALON';
//scr:=srv.Databases('ETALON').StoredProcedures('DeleteFromShema').Script;
Memo2.Text:=scr;
finally
srv.DisConnect;
end;
end;
Хозяин (2006-05-05 17:38:00) [6]Кстати скрипт [0] в QA у меня ошибок не выдавал
с @cScript varchar(8000)
если тело скрипта весит меньше 8000 - то все ОК
если больше - то выдает NULL
[8] - тоже выдает NULL, но это понятно.
Хозяин (2006-05-05 17:07:00) [7]Согласен.
:)
Nikolay M. (2006-05-05 16:34:00) [8]
> Сейчас уже врубилась,
> (05.05.06 16:12) [21]
Лучше поздно, чем никогда :)
Ольга (2006-05-05 16:12:00) [9]То, что зациклилась - это верно подмечено. Сейчас уже врубилась, попробую из Дельфи.
Nikolay M. (2006-05-05 16:03:00) [10]
> Ольга (05.05.06 15:46) [19]
> О Дельфи вообще речи не было.
Опять ссылаюсь на [1]. Я не предлагал создавать СОМ-объект именно в Дельфи, делайте на чем нравится.
> > а конструкция ... вообще выдаст ошибку компиляции.
>
> Если в Query записать только эту строку, то конечно.
Если в Query записать "только эту строку", то ошибки компиляции не будет. Но опять же, я не предлагал это делать! Как можно так понять код на Дельфи, в котором нет ни слова о Query и его использование даже не предполагается?
var
srv : OleVariant;
begin
srv := CreateOleObject ('SQLDMO.SQLServer');
srv.Connect (...);
// Дальше и так знаете
end;
Такое ощущение, что Вы в упор не хотите меня понимать, а зациклились на своем T-SQL-ном скрипте. С SQL-DMO, как и с любым другим СОМ-объектом, можно работать не только из T-SQL.
Ольга (2006-05-05 15:46:00) [11]
> В Дельфи нет типа varchar(8000)
О Дельфи вообще речи не было. Я пока работаю на сервере БД. В каком виде будет клиентская часть пока не решила (дельфовое приложение, или только DLL, возможно СОМ).
> а конструкция ... вообще выдаст ошибку компиляции.
Если в Query записать только эту строку, то конечно. Нужно выполнить весь блок из [0], начиная с создания объекта.
Nikolay M. (2006-05-05 13:39:00) [12]
> Вот как раз дальше то и не получается. Облом на строке
> EXEC sp_OAMethod @oObj, 'Script', @cScript output
> т.к. переменной по максимуму @cScript varchar(8000) не хватает
> для записи в нее скрипта.
Покажите код, который не получается. В Дельфи нет типа varchar(8000), а конструкция
EXEC sp_OAMethod @oObj, 'Script', @cScript output
вообще выдаст ошибку компиляции.
> в таблице syscomments в поле text нашла только первые n-
> символов тела процедуры. Или я не там ищу, или заработалась.
Одно из двух. Если скрипт не помещается в varchar (8000), то он тем более не поместится в nvarchar (4000) (тип поля syscomments.text).
Ольга (2006-05-05 13:32:00) [13]
> begin
> srv := CreateOleObject ('SQLDMO.SQLServer');
> srv.Connect (...);
> // Дальше и так знаете
> end;
Вот как раз дальше то и не получается. Облом на строке
EXEC sp_OAMethod @oObj, 'Script', @cScript output
т.к. переменной по максимуму @cScript varchar(8000) не хватает для записи в нее скрипта.
Можно воспользоваться методом ScriptTransfer
EXEC sp_OAMethod @object, 'ScriptTransfer',NULL, @tfobject, 2, @outputfile
который пишет в файл, но это тоже не устраивает (см.[13])
Хотела уже сдасться и начала делать скрипт врукопашную, но к своему великому удивлению в таблице syscomments в поле text нашла только первые n-символов тела процедуры. Или я не там ищу, или заработалась...
Nikolay M. (2006-05-05 11:52:00) [14]
> ак в СОМ-объекте будет реализована функция, которая генерит
> скрипт объектов?
var
srv : OleVariant;
begin
srv := CreateOleObject ('SQLDMO.SQLServer');
srv.Connect (...);
// Дальше и так знаете
end;
Если это должно работать на клиентском компьютере, придется таскать с собой несколько файликов (БОЛ: Installing SQL-DMO).
Если на сервере, то упаковываете код в СОМ-объект, единственную функцию которого будете потом дергать из T-SQL. Передача данных зависит от Ваших конкретных условий, самое тупое - это класть скрипт в табличку с TEXT-полем, а функция будет возвращать ID вставленной записи.
Ольга (2006-05-05 11:33:00) [15][14]
Прочитала внимательнее. Ответа на свой вопрос не нашла: как в СОМ-объекте будет реализована функция, которая генерит скрипт объектов? Конкретнее, как сгенерированный скрипт (>8000) передать пользователю?
Nikolay M. (2006-05-05 11:17:00) [16]
> Ольга (05.05.06 07:13) [6]
>
> Не хочу формировать скрипт врукопашную - громоздко и по-
> кустарному. По-моему, лучше, если это делает сам сервер
> с учетом конкретных особенностей данной БД.
А я и не предлагал делать скрипт вручную, читайте мой ответ внимательнее.
Ольга (2006-05-05 10:38:00) [17]Разобралась в процедуре sp_generate_script. Она пишет скрипт в файл по назначенному пути. Может по запросу считать информацию из файла.
Создалась процедура у меня с ошибками - в ней есть вызов двух других процедур, которых у меня не оказалось.
1. sp_displayoaerrorinfo - обработка ошибок, я ее создала сама
2. sp_readtextfile - чтение скрипта из файла
Здесь я задумалась, стоит ли связываться с файлами. Сервер не может создать файл на компьютере пользователя, пользователь может не иметь доступа к файловой системе сервера (мой случай), чтобы считать файл с сервера. Можно, конечно, в самой процедуре счтать из файла во временную таблицу... но уж больно кривой путь получается. Надо найти более простое решение.
Хозяин (2006-05-05 08:32:00) [18]Ольга, не получилось воспроизвести Вашу ошибку, вечерком еще попробую.
Хозяин (2006-05-05 07:56:00) [19]У вас нет небольшого примерчика с использованием объекта Transfer?
http://www.xozyain.nm.ru/sp_generate_script.zip
Ольга (2006-05-05 07:47:00) [20][8]
Не помогло. С параметром @cScript ntext=NULL процедура скомпилировалась. Но при выполнении выдала ошибку:
sp_OAMethod Script: ODSOLE Extended Procedure, Error in srv_paramset.
[9]
Это очень интересно. Иерархию зависимостей я строю сама (задачка неожиданно оказалась очень не тривиальной), но не уверена, что отследила все уровни зависимостей. У вас нет небольшого примерчика с использованием объекта Transfer?