Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Импорт из Акцес в MS Sql Server  (Прочитано 11270 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 19-11-2004 11:35 » 

Есть база акцесовская нужно из нее регулярно таcкать данные в SQL сервер.
Записей в табличке много  > 30000  и каждый день добавляется еще 3-4 десятка(собственно ради них и все и затевается).

Пишу DST пакет, открываю 2 соединения создаю тарнсфер.  Делаю
Код:
select * from [Часовые] 
из таблицы  акцеса и перегоняю данные в sql Server.

Чтоб не мотать каждый раз всю таблицу, накладываю ограничение получается
Код:
select * from [Часовые] where ДатаВремя>=date()-5 
Что б брал не все а только за последние 5 дней.

Как только добовляю where ДатаВремя>=date()-5 данные пестают импортироваться ДТС отрабатывает без ошибок, но ни одна запись не вставляется. По внешнему виду похоже что нет не одной записи соотвествующей условию.
 Этот же запрос запущеный в акцес возвращает положеное количество записей.
Погонял пакет несколько раз, в друг с дуру импортировалось потом опять перестало.
Не сталкивался никто с такой фигней?
« Последнее редактирование: 02-12-2007 18:18 от Алексей1153++ » Записан

Да да нет нет все остальное от лукавого.
Alf
Гость
« Ответ #1 : 19-11-2004 11:55 » 

Попробуй вместо date() поставить GETDATE()
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 19-11-2004 12:07 » 

getdatе  акцес не принимает ... конект к базе делается по средством ОleDB

Да и не вдате дело вообще глюк проявляет себя при любой попытке наложить ограничение.
Записан

Да да нет нет все остальное от лукавого.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 19-11-2004 17:07 » 

А перегонку данных инициализирует Access?

Просто, если положение базы Access фиксированное (путь к ней), то можно делать наоборот, подключить базу как внешний источник данных к серверу, в SQL Server установить job, который SQL Server Agent будет запускать периодический.

Если не навру, то в сервере нужно будет написать dateadd(day, -5, getdate()). А вот в Access, если память не изменяет, тоже есть аналогичная функция прибавления даты. Ты уверен, что date()-5 правильно работает?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #4 : 19-11-2004 19:12 » new

Цитата
Погонял пакет несколько раз, в друг с дуру импортировалось потом опять перестало

Тогда дело не в условиях отбора и не в date(). Похоже, у тебя происходит дублирование ключевых полей при вставке данных в таблицу SQL. При реальной работе такого быть не должно (если данные будут копироваться 1 раз в 5 дней), а вот при отладке - легко. ИМХО "сдуру" он импортировал записи тогда, когда все записи из Access'а (а точнее значения их ключевых полей) не конфликтовали с записями в таблице SQL. При втором прогоне, ясное дело, происходит Violation of primary key constraint.
Лечить в принципе не нужно, ведь если пакет будет выполняться только 1 раз в 5 дней, то глюков не будет. Только тогда нужно писать
Код:
select * from [Часовые] where ДатаВремя > date()-5
т.е. неравенство должно быть строгим. Иначе, например, при последовательном запуске задания 1-го и 6-го числа в оба захода будут копироваться данные за 1-е число.
В принципе, можно включить в набор ключевых столбцов столбец Identity (или уже имеющийся столбец ключа пометить как Identity), но такое изменение структуры таблицы породит дублирование данных, хоть и можно будет без ошибок выполнять импорт несколько раз подряд
« Последнее редактирование: 02-12-2007 18:19 от Алексей1153++ » Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 22-11-2004 10:09 » 

Mouse, ошибок при выполнении DTS пакета не происходит, дублирование ключей тоже не может быть потому как данные перегоняются в мусорные таблицы которые перед импортом дропаются и создаются заново.dimka, Импорт инициирует SQL Server, со связаными таблицами тоже вариант но не очень хочется....
Date()-5  это последний самый дубовый варинт, в первом случае я пробовал более элегантный метод в акцесе лежит табличка в которой для каждого источника зафиксирована дата и время последнего импорта и соотвественно был запрос

select * from [Часовые] where ДатаВремя > (select last_date from fixTime where id_count=1)

 чтоб для каждого источника взять только те данные которые еще не импортированы.
Результат тот же ...  

Технически я проблему решил, создал запрос в базе с нужными ограничениями и просто теперь делаю из него селект, я хочу понять в чем собственно была проблема ато получается как в анекдоте "-Ты сам не знаешь что починил или не хочешь говорить?"
Записан

Да да нет нет все остальное от лукавого.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-11-2004 12:04 » 

Не совсем понял, каким образом SQL Server инициализирует связь с базой, да ещё так, чтобы не работало.

Например. Создаём прилинкованный к источнику данных сервер (к базе Northwind из Access).
Код:
sp_addlinkedserver 'AccessDB', 'Access 2003', 'Microsoft.Jet.OLEDB.4.0', 
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb'

Теперь эта база подключена как сервер AccessDB (в EM можно увидеть в Security/Linked Servers)

Теперь делаем запрос.
Код:
select o.*
from AccessDB...Orders o
where datediff(year, o.OrderDate, getdate()) > 6

Запрос рабочий, принимает синтаксис SQL Server, а не Access, WHERE корректно отрабатывает.

А ты как базу подключаешь?
(видимо, через внешнюю хранимую процедуру)
« Последнее редактирование: 02-12-2007 18:21 от Алексей1153++ » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines