Страница 1 из 2

MS SQL Server 2000 вопросик 2

Добавлено: 12 янв 2006, 15:09
AlexK
There is a DTS package that runs and transfers data from MS Access 2000 file to MS SQL 2000 db.

The data source for this transformation is Access query which is similar to a view in SQL Server. This query calls a function to return a value for one of the resulting fields, somethign like

Код: Выделить всё

SELECT a,b,c, GetD(val1, val2) AS d
GetD() is actually the Access VBA function in one of its modules. Apparently you can do this.

Now, when I run above query in Access itself it works fine. When I run a DTS package step that uses this query as the source I get error saying "Undefined function GetD() in expression". :x

Any good ideas?

Добавлено: 12 янв 2006, 15:25
AlexK
http://groups.google.com/group/microsof ... 31e0133a28

Indeed, calling any VBA function, including user defined function (in a
standard module) within an SQL JET query is only available from within
Access. It won't work from VB, VC++, Delphi, ... neither Excel. DLookup is
not from the core of SQL but from VBA, so, DLookup won't work, neither Nz.
IIf will work, on the other hand, since JET-SQL defines iif and don't relay
on the iif as defined in VBA, same thing with some (other) arithmetic
operators.
Хм, и что теперь делать? Там такая навороченная функция с доп.селектами и рекурсией. Вот блин. %^@#$ ACCESS!

Добавлено: 12 янв 2006, 16:05
ura
Наверное можно написать свой DTS package и дергать его через COM API если это MSSQL2000.

Добавлено: 12 янв 2006, 16:09
AlexK
Так я и написал свой. К аксесу он лезет через Jet provider, и как написано выше

"Indeed, calling any VBA function, including user defined function (in a
standard module) within an SQL JET query is only available from within
Access."

Хотя непонятно, я же просто вызываю аксесную квери, а что она уже внутри дергает какое до этого дело провайдеру.

Добавлено: 12 янв 2006, 16:31
ura
Прошу прщения, тогда наверное надо писать VBA application.
А кстати какой метод соединения DTS использует для коннекта к Access базе - ole db provider для Jet?

Добавлено: 12 янв 2006, 16:45
AlexK
Jet OLEDB driver

Так от VBA и пытается клиент избавится. Счас это все на Аксесе а переводим на asp.net 2.0. Одна из страниц позволяет аплоад Аксесную базу, и вот ее то и нужно экспорт на sql 2000. Я запускаю dtsrun ultility с нужными параметрами и все работает отлично, кроме этой одной квери. Так штаа...

Добавлено: 12 янв 2006, 20:14
ura
A что такое собственно GetD? Трудно ли ее переписать используя тот же Custom SQL function. Т.е. идея была бы перенести таблицу во временную таблицу SQL (a, b, c, val1, val2 ) и затем пройтись уже там с реализованой GetD но на стороне SQL сервера

Добавлено: 12 янв 2006, 21:02
AlexK
Там стооолько всего накручено внутри этой функции! :roll: Но по другому видать не получится. Спасибо за идею!
:beer:

Добавлено: 12 янв 2006, 21:42
Zy
Как всегда предлагаю кардинальное решение - Oracle!

Добавлено: 13 янв 2006, 08:31
Vovchik
AlexK писал(а):http://groups.google.com/group/microsof ... 31e0133a28

Indeed, calling any VBA function, including user defined function (in a
standard module) within an SQL JET query is only available from within
Access. It won't work from VB, VC++, Delphi, ... neither Excel. DLookup is
not from the core of SQL but from VBA, so, DLookup won't work, neither Nz.
IIf will work, on the other hand, since JET-SQL defines iif and don't relay
on the iif as defined in VBA, same thing with some (other) arithmetic
operators.
Хм, и что теперь делать? Там такая навороченная функция с доп.селектами и рекурсией. Вот блин. %^@#$ ACCESS!
Снимать штаны и бегать. Создаешь новую таблицу а аксессе. Двигаешь в нее данные чтоб там были уже обработанные данные. Т.е.

Insert into stage_table (a, b, c, res_getid)
(select a, b, c, get_id(val1, val2) from table_sourse)

В результате имеем таблицу в ктором тока данные. Ее и двигаешь куда следуем. А все то что требует get_id - херишь. Как два палтца об асфальт.

Добавлено: 13 янв 2006, 09:34
AlexK
Insert into stage_table (a, b, c, res_getid)
(select a, b, c, get_id(val1, val2) from table_sourse)
и "что" будет этот SQL statement запускать?

у меня аксесный файл на сервере полученный через upload, я к нему обрашаюсь через DTS package. In my case a DTS package step that executes access query which using that function inside fails! I am not calling that fucntuon directly - just a query that has it inside.
So how different is what are you suggesting?

Добавлено: 13 янв 2006, 09:41
Vovchik
AlexK писал(а):
Insert into stage_table (a, b, c, res_getid)
(select a, b, c, get_id(val1, val2) from table_sourse)
и "что" будет этот SQL statement запускать?

у меня аксесный файл на сервере полученный через upload, я к нему обрашаюсь через DTS package. In my case a DTS package step that executes access query which using that function inside fails! I am not calling that fucntuon directly - just a query that has it inside.
So how different is what are you suggesting?
Бля - запускаешь аксеесс и в нем в самом аксеессе все делаешь. Еще раз - сначала тебе надо обработать данные в самом аксессе средствами самого аксесса и без всяких ДТС и прочего.... Чтобы в резултате в аксеессе были данные которые можно брать без испльзования каких либо функций и прочей муйни и пихать куда хочешь.

Добавлено: 13 янв 2006, 11:08
AlexK
вовчик не нэрвничай! :lol: чем запускать еще раз тебя спрашиваю?? ногами? или как automation object from asp.net page? ты можешь себя представить что будет с сервером если таким образом запустить несколько десятков обьектов. попробуй у себя на компьютере открыть 50 аксесных файлов по 30 Мб каждый. возможно на данном этапе и не будет 50 одновременных пользователей но их количество будет только расти. это система для импорта репортов из аксеса в sql для большой конторы.

Добавлено: 13 янв 2006, 11:38
Vovchik
AlexK писал(а):вовчик не нэрвничай! :lol: чем запускать еще раз тебя спрашиваю?? ногами? или как automation object from asp.net page? ты можешь себя представить что будет с сервером если таким образом запустить несколько десятков обьектов. попробуй у себя на компьютере открыть 50 аксесных файлов по 30 Мб каждый. возможно на данном этапе и не будет 50 одновременных пользователей но их количество будет только расти. это система для импорта репортов из аксеса в sql для большой конторы.
Ах вот оно что. Запускать ручками. А ежели тебе надо софт писать - то придется тебе написать аппликуху. Где данные менять ручками заместо аксессной функции. Лично я такое могу сваять с помощью Поверобилдера и процедур сикуел сервера. ТОлько придется написать свою функцию замесьто GetD. Или спереть че нить похожее. А чем там да как в дот нете.. Еще в аксеессе можно сваять хранимый запрос. Только вот как его запустить чтоб не ручками это я уж не знаю.

Добавлено: 13 янв 2006, 14:10
AlexK
Ну наконец-то ты меня понял. "аппликуха" уже написана - аsp.net based web app.
"Только вот как его запустить чтоб не ручками это я уж не знаю" - вот и я пока не знаю. в крайнем случае и как временное решение таки наверно придется через automation objects напрямую в Аксес лезть и делать "select * into newtemptable from stupidquery".
Слава богу скоро они полностью от Аксеса отказываются.

Vovchik cheers! :beer: