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

Откуда: г. Минск
Сообщений: 5127
В MS SQL Server можно использовать временные таблицы.
Задача - хочу использовать временные таблицы при импорте данных (таблиц) из баз MDB. Импортирую данные следующей командой
   DoCmd.TransferDatabase acImport, "Microsoft Access", strBase, acTable, strSourceTable, strDestinationTable, False
При этом
   strSourceTable = tdf.Name
   strDestinationTable = "#" & strSourceTable
Команда отрабатывает, но никаких таблиц не создается и сообщений об ошибках нет. При попытке обратиться к таблице strDestinationTable Access сообщает, что такой таблицы нет. Если же я указываю вместо временной простую таблицу, например
   strDestinationTable = strSourceTable & "A"
То таблица создается и с ней можно работать. Если я создаю временную таблицу оператором CREATE (пример)
CREATE TABLE #t(IdMaterial Int PRIMARY KEY)
то она создается.
Может кто-нибудь знает, в чем загвоздка?
2 фев 09, 16:25    [6767915]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10938
могу предположить что проблема в том что временные таблицы доступны только
в рамках того коннекта в котором они созданы

у аксесса может под разные задачи использоваться несколько коннектов
скорее всего под DoCmd.TransferDatabase используется один коннект а для отображения списка таблиц - другой
2 фев 09, 17:08    [6768262]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
adv
Member

Откуда:
Сообщений: 3333
Может попробовать глобальную временную ##таблицу? Чтобы всем было видно.

зы. Сам не проверял - так, мысли в слух.
2 фев 09, 17:17    [6768363]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
adv
Member

Откуда:
Сообщений: 3333
adv
Может попробовать глобальную временную ##таблицу? Чтобы всем было видно.

зы. Сам не проверял - так, мысли в слух.
Оппа здал

2 фев 09, 17:18    [6768381]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Попробовал ##table - результаты аналогичные #table.
Где-то на форуме вычитал, что надо создать временную таблицу (CREATE TABLE #...) нужной структуры, а потом в неё писать. Временные таблицы должны по структуре соответствовать имеющимся. Есть ли простой способ создать такую временную таблицу?
===================================================================
А, ты, вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
2 фев 09, 17:49    [6768662]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
вроде проще этого некуда:
select * 
into #tmptable 
from dbo.mytable 
2 фев 09, 22:26    [6769511]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Да, таким Макаром таблица создается. Только надо чуть-чуть подправить код
select * 
into #tmptable 
from dbo.mytable 
where 1=0
А вот как в такую таблицу вставить данные из MDB у меня что-то не получается. Конечно, можно открыть два рекордсета и копировать по записям из одного в другой, ну уж очень это муторно и долго. Операция типа
        DoCmd.TransferDatabase acImport, "Microsoft Access", strBase, acTable, strSourceTable, strDestinationTable, False
не проходит. Для простой таблицы все получается. А вот для временной... DoCmd.TransferDatabase acImport создает временный файл внутри своей сессии, пишет в него, а когда сессия закрывается, файл уничтожается. Может есть какие-нибудь идеи?
Вроде бы должен помочь INSERT INTO... Но здесь я запутался с провайдерами. Restavraciya подсказал, как скопировать из SQL Server в MDB, а вот наоборот что-то не получается.
3 фев 09, 19:23    [6774771]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Guest33
Member

Откуда:
Сообщений: 2071
Ну, можно держать набор пустых простых таблиц как буфер для обмена. Ничего страшного. Если все-таки хочется через временные - попробуйте линкед сервер (уже советовал в прошлом Вашем топике):
use master

exec sp_addlinkedserver @server = 'UFO2', 
@provider = 'Microsoft.Jet.OLEDB.4.0', 
@srvproduct = 'OLE DB Provider for Jet', 
@datasrc = '\\Me\FolioWin\db1.mdb' 
go
EXEC sp_addlinkedsrvlogin 'UFO2', 'false', 'sa', 'Admin', NULL
go
select * into #tmptable from ufo2...toto 
-- Здесь какие-нибудь операции с врем таблицей в рамках текущего коннекта
go
EXEC sp_droplinkedsrvlogin 'UFO2', NULL
EXEC sp_dropserver 'UFO2','droplogins'

PS там где GO - отдельные запросы, а то и коннекты
3 фев 09, 21:45    [6775068]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Restavraciya
Member [заблокирован]

Откуда:
Сообщений: 5139
автор
подсказал, как скопировать из SQL Server в MDB, а вот наоборот что-то не получается.
IN поставить сразу после имени приемной таблицы
Dim cn As New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\db8.mdb';"
    ' с сервера в мдб
    cn.Execute "SELECT * INTO [mdb_Table] FROM [sql_Table] IN '' [ODBC;Driver={SQL Server};Server=USER-C1HQQG1KRP;DATABASE=myBD]"
    ' из мдб на сервер
    cn.Execute "SELECT * INTO [sql_Table] IN '' [ODBC;Driver={SQL Server};Server=USER-C1HQQG1KRP;DATABASE=myBD] FROM [mdb_Table]"
    cn.Close
4 фев 09, 05:44    [6775482]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Restavraciya
Member [заблокирован]

Откуда:
Сообщений: 5139
автор
INSERT INTO
Упс. Инсерт так не работает :-(
4 фев 09, 05:52    [6775487]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Restavraciya
Member [заблокирован]

Откуда:
Сообщений: 5139
Отбой - работает
INSERT INTO [sql_Table] IN '' [ODBC;Driver={SQL Server};Server=USER-C1HQQG1KRP;DATABASE=myBD] SELECT * FROM [mdb_Table]
4 фев 09, 06:07    [6775495]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Restavraciya
Member [заблокирован]

Откуда:
Сообщений: 5139
Но для временных таблиц это не будет работать
4 фев 09, 06:30    [6775499]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Да, поддерживать пустые временные таблицы для обмена это возможно и выход из положения. Только в таблицу надо добавить столбец с кодом пользователя. (Ведь могут сразу несколько пользователей заняться экспортом. Или надо как-то блокировать изменение в таблице на период экспорта) Кстати, что лучше всего взять в качестве такого кода?

И если изменится структура таблицы, то придется менять и структуру временной таблицы. Может при импорте создавать таблицы с учетом кода пользователя? Например импорт из table1 в table1_user1 . Тогда не будет конфликтов между различными пользователями.

Но тогда возникает вопрос. Импорт информации происходит раз в квартал - т.е. 4 раза в год. В процессе одного импорта будет создано и удалено около 1500 таблиц. Как это скажется на самой базе? Наверно с этим вопросом лучше обратиться на форум по SQL Server-у.
4 фев 09, 11:03    [6776366]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Restavraciya
Member [заблокирован]

Откуда:
Сообщений: 5139
автор
при импорте создавать таблицы с учетом кода пользователя

Временные таблицы не пересекутся - они свои у каждого, не говоря уже о том что они разные у одно на разных соединениях. BOL глядите и пример:
+ Пример
Sub sTempTablesTest()
Dim cn1 As New ADODB.Connection, cn2 As New ADODB.Connection    
    cn1.Open "Driver={SQL Server};Server=(local);DATABASE=razrabotka"
    cn2.Open "Driver={SQL Server};Server=(local);DATABASE=razrabotka"
    
    cn1.Execute "select * into #tmp from (select top 1 * from ActiveUsers) t"
    cn2.Execute "select * into #tmp from ActiveUsers"
    
    Debug.Print "cn1: ", cn1.Execute("select count(*) from #tmp").Fields(0)
    Debug.Print "cn2: ", cn2.Execute("select count(*) from #tmp").Fields(0)
End Sub
------------
cn1:           1 
cn2:           6 
4 фев 09, 11:31    [6776629]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Latuk
Member

Откуда: N 54°38', E 037°35'
Сообщений: 7310
Проще всего использовать для этих целей постоянную таблицу с полем для фильтра по @@SPID
получаете значение @@SPID от любого из ваших подключений
при вставке\выборке\удалении\добавлении используете его для фильтрации сеанса
заодно не будет проблем с отображением содержимого в запросах\источниках форм

использование глобальной-временной таблицы ## тоже возможно
но после ее добавления необходимо позаботится об уникальности названия (например с помощью того же @@SPID)
и обновить список таблиц, чтобы служебные подключения акса ее тоже увидели
в общем гемор

в принципе возможно обратится из другого подключения и к локальной-временной таблице #
она находится в tempdb с крокозябристым названием но это еще больший гемор

ps используя извращения в аксе будь готов к наказанию тяжелым и бессмысленным трудом :)
4 фев 09, 12:12    [6776962]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Я не виноватый... Они меня заставили...(с) Автор неизвестен...

Попробую полностью изложить проблему.

Имеется: головной офис и филиалы, разбросанные по районам. Филиалов больше десятка. Значительно больше. В базе около 40 таблиц. около 30 - данные практически не меняются. Это различные справочники и классификаторы. В остальных таблицах - переменные данные. При чем каждый филиал вносит свои данные, которые не перекрываются. (основные фонды, договора, платежки и т.п.). Раз в месяц эти данные надо объединять, обрабатывать, анализировать.

Надо иметь базы на местах, а потом сливать их в главном офисе. Поначалу решил использовать репликацию. Два типа репликации. Для таблиц, которые не изменяются - метод моментальных снимков. Для таблиц, которые изменяются - merge-репликация.

Проблема синхронизации. Как синхронизировать? Если бы сервера были в локальной сети, то не было бы проблем. А так связь с офисами через электронную почту, да модем типа 56К.

Я пробовал решить эту проблему так. Создаю копии баз данных и подписки на своем компьютере для всех офисов и выполняю на нем синхронизацию. Потом бэкапю базы и рассылаю бэкапы по филиалам. В офисах работают с базой, затем делают бэкап и отсылают обратно. Здесь я восстанавливаю базы из бекапов, провожу синхронизацию, после обрабатывается общая база, производится необходимая корректировка. Потом опять синхронизация, бэкапы, рассылка и все по новой. При такой организации трафик более гига за один раз. Как его сократить? Бэкап приходится делать полный, т.к. бэкап изменений (Differential) не хочет восстанавливаться.

После тестового прогона и обнародованных данных, начальство отказалось от репликации. "Некрасиво..." И предложило написать что-то вроде ETL - (от англ. Extract, Transform, Load) Вот я и мучаюсь. Решил для обмена информацией использовать MDB (пробовал XML, но отказался, объем по сравнению с MDB больше и те же проблемы с временными таблицами). Всё бы хорошо, но вот нельзя использовать временные таблицы. А создание - удаление около полутора тысяч таблиц за один этап синхронизации... Я не знаю как на это отреагирует база. Будет расти и как? И какие могут возникнуть нюансы?
4 фев 09, 18:25    [6779969]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Guest33
Member

Откуда:
Сообщений: 2071
автор
Всё бы хорошо, но вот нельзя использовать временные таблицы. А создание - удаление около полутора тысяч таблиц за один этап синхронизации... Я не знаю как на это отреагирует база.

1) Временные таблицы таки можно использовать, см например, что я предлагал с линкед базами Акцесса.
2) Никто не заставляет держать эти тысячи таблиц в рабочей базе - их можно расположить в специальной, буферной.
3) Почему тысячи - ведь таблицы однотипные для разных филиалов?
4) Из нашего опыта - обновление бызы офиса данными из магазинов: ежедневно сбрасываются только новые или модифицированные накладные и данные справочников в них входящие. Передача - через промежуточную МДБ, данные в нее загоняются путем Transferdatabase из запросов. В базе офиса данные сперва попадают в промежуточные таблицы, анализируются и принимаются в рабочие. Кусок кода для приема из MDB в промежут. табл-цы:
For J = 1 To 8

    DoEvents

    q2.SQL = "delete from " & tName(J)
    q2.ReturnsRecords = False
    q2.Execute
    
    txt = "select * from " & tName(J) & " IN 'd:\foliowin\trans.mdb' "
    
    q.SQL = txt
    Set R = q.OpenRecordset
    
    If J = 1 And R.RecordCount = 0 Then
       R.Close
       Set q = Nothing
       Set q2 = Nothing
       MsgBox "Нет данных для переноса!", vbInformation
        Exit Function
    End If
    
    'Torg_Zal begin
    q2.SQL = "select * from " & tName(J)
    q2.ReturnsRecords = True
    Set MyTblRec = q2.OpenRecordset
    If MyTblRec.Fields.Count <= R.Fields.Count Then
      FldCount = MyTblRec.Fields.Count
    Else
      FldCount = R.Fields.Count
    End If
    MyTblRec.Close
    'Torg_Zal end
    
    Do While Not R.EOF
      For i = 0 To FldCount - 1 ''Torg_Zal R.Fields.Count - 1
        If Not IsNull(R.Fields(i).Value) Then
        If R.Fields(i).Type = 12 Then
            MemoName = R.Fields(i).Name
            MemoValue = R.Fields(i).Value
        Else
            FldStr = FldStr & R.Fields(i).Name & ","
            'Debug.Print R.Fields(i).Name & " / " & R.Fields(i).Type
            Select Case R.Fields(i).Type
              Case 1
                VlsStr = VlsStr & CMyBool(R.Fields(i).Value) & ","
              Case 8
                VlsStr = VlsStr & "'" & Format(R.Fields(i).Value, "yyyymmdd") & "',"
              Case 10
                QTxt = R.Fields(i).Value
                If InStr(QTxt, "'") > 0 Then
                  VlsStr = VlsStr & "'" & PrepareQuoted(QTxt) & "',"
                Else
                  VlsStr = VlsStr & "'" & R.Fields(i).Value & "',"
                End If
              Case Else
                VlsStr = VlsStr & R.Fields(i).Value & ","
            End Select
         End If
         End If
         'End If
      Next i
      FldStr = "(" & Left(FldStr, Len(FldStr) - 1) & ")"
      VlsStr = "(" & Left(VlsStr, Len(VlsStr) - 1) & ")"
      q2.SQL = "insert into " & tName(J) & " " & FldStr & " values " & VlsStr
      q2.ReturnsRecords = False
      'Debug.Print VlsStr
      q2.Execute
      
      If Not IsEmpty(MemoValue) Then
         q2.SQL = "update " & tName(J) & " set " & MemoName & "= '" & MemoValue & "' where " & MemoName & " is null"
         q2.Execute
      End If
      
      FldStr = ""
      VlsStr = ""
      MemoName = ""
      MemoValue = Empty
      
      R.MoveNext
    Loop
Next J
4 фев 09, 22:57    [6780685]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Отвечаю по порядку
Guest33
1) Временные таблицы таки можно использовать, см например, что я предлагал с линкед базами Акцесса.
Не хотелось связываться с хранимыми процедурами. Ещё маловато опыта. Но видимо придется поэкспериментировать.
Guest33
2) Никто не заставляет держать эти тысячи таблиц в рабочей базе - их можно расположить в специальной, буферной.
Возможно это и выход. Но дополнительная база... Посмотрим, что скажет начальство.
Guest33
3) Почему тысячи - ведь таблицы однотипные для разных филиалов?
Я их удаляю после окончания обработки. А потом создаю заново для нового ввода. Наверно можно просто очищать.

Спасибо за код. Буду сидеть разбираться.
5 фев 09, 09:42    [6781247]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1052
Joss
В MS SQL Server можно использовать временные таблицы.
Задача - хочу использовать временные таблицы при импорте данных (таблиц) из баз MDB. Импортирую данные следующей командой
   DoCmd.TransferDatabase acImport, "Microsoft Access", strBase, acTable, strSourceTable, strDestinationTable, False
При этом
   strSourceTable = tdf.Name
   strDestinationTable = "#" & strSourceTable
Команда отрабатывает, но никаких таблиц не создается и сообщений об ошибках нет. При попытке обратиться к таблице strDestinationTable Access сообщает, что такой таблицы нет.


А так пробовали?
strDestinationTable = "tempdb..#" & strSourceTable
5 фев 09, 15:46    [6784059]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
VladimirKr
А так пробовали?
strDestinationTable = "tempdb..#" & strSourceTable
В операции
   DoCmd.TransferDatabase acImport, "Microsoft Access", strBase, acTable, strSourceTable, strDestinationTable, False
Выдает ошибку 3146 (ODBC - ошибка вызова, There is already an object named 'tempdb..#tblDocums' in the database (#2714)).
5 фев 09, 17:39    [6784964]     Ответить | Цитировать Сообщить модератору
 Re: Access 2003 + MS SQL Server 2005. Импорт во временные таблицы.  [new]
adv
Member

Откуда:
Сообщений: 3333
Да зачем здесь (временные) таблицы?

Что мешает сделать всё через линкедСерверы?
Код же уже дали, не бойтесь, 'сделайте первый шаг, остальное за вас сделает сила тяжести' :)
5 фев 09, 19:29    [6785418]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить