Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закачка данных на MS-SQL Server / 9 сообщений из 9, страница 1 из 1
02.12.2003, 10:18
    #32340259
Newb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
Подскажите пожалуста, как правильно перекачать на сервер содержимое курсора во временную таблицу (структуры совпадают).

* подключаюсь
m.pcConnectHeader=SQLSTRINGCONNECT(m.pcConnectString)
* создаю временную таблицу
m.lcSQL = "CREATE TABLE ##Tab1(Pole1 int, Pole2 varchar(50))"
= SQLEXEC(m.pcConnectHeader, m.lcSQL)

А вот что дальше? Видел несколько замороченных вариантов с таблицами, но честно говоря без комментариев мало что понял. Мне они показались довольно замороченными.
Хочется сделать так чтобы это было быстро, надежно и красиво.

Спасибо.
...
Рейтинг: 0 / 0
02.12.2003, 10:59
    #32340322
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
Ну например так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
* подключаюсь 
m.pcConnectHeader=SQLSTRINGCONNECT(m.pcConnectString) 
* создаю временную таблицу 
m.lcSQL =  "CREATE TABLE #Tab1(Pole1 int, Pole2 varchar(50 ))" 
= SQLEXEC(m.pcConnectHeader, m.lcSQL) 

m.lcSQL =  "insert #Tab1(Pole1, Pole2) values(?pole1,?pole2)"  
select localtable
scan
= SQLEXEC(m.pcConnectHeader, m.lcSQL)  
endscan
...
Рейтинг: 0 / 0
02.12.2003, 12:33
    #32340532
Newb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
Спасибо. Работает и понятно.
Вот только если данных много тормозить не будет?
А можно ли (пардон за наивный вопрос) чтото типа "пакетной обработки" придумать?
...
Рейтинг: 0 / 0
02.12.2003, 13:22
    #32340640
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
Ну можно еще строку заполняющую временную табличку сделать или передать XML и обработать его средствами сервера...Только врядли удастся добиться ощутимой прибавки производительности..
...
Рейтинг: 0 / 0
02.12.2003, 13:25
    #32340648
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
А сколько это много данных и зачем при этом использовать временную таблицу?
...
Рейтинг: 0 / 0
02.12.2003, 20:06
    #32341294
Newb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
Тут одна проблема нарисовалась.
Если много полей, то способ указанный выше не работает. фокс 8.0 кидает сообщение об ошибке.
Я прочитал что с таблицами хорошо работает OPENQUERY

Но в моем случае запрос не проходит.
m.lcSQL = "INSERT INTO ##Tab1 SELECT * FROM " +;
"OPENQUERY("+ m.ServerName + ",'SELECT * FROM Cursor1')"
= SQLEXEC(m.pcConnectHeader, m.lcSQL)

MESSAGE() говорит что:
Connectivity error. "Проверьте что путь задан правильно и имеется подключение к серверу на котором находятся файлы"

Или этот способ нельзя использовать для курсоров?

Так всетаки как проще и красивее экспортировать курсор в таблицу на MS-SQL Servere ?
...
Рейтинг: 0 / 0
03.12.2003, 10:19
    #32341584
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
Какое сообщение кидает фокс?
Проблема может быть только в ограничении 254 символа на консанту. В этом случае надо просто разбивать выражение
Код: plaintext
1.
m.lcSQL =  "insert #Tab1(Pole1, Pole2)" +;
               "values(?pole1,?pole2)"  

Я например в основном использую XML передавая его в хранимую процедуру.
Или просто собираю строку содержащую все insert.
OPENQUERY в вашем случае не очень удачное решение. Он работает только с локальными данными...
...
Рейтинг: 0 / 0
03.12.2003, 10:20
    #32341587
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
По поводу XML
Вот пример от Glory
CREATE CURSOR test (f1 C(10), f2 N(10,2))
INSERT INTO test VALUES('FFFF', 1.5)
INSERT INTO test VALUES('AAAAA', 2.5)
myxml = ''
?CursorToXML("test", "m.myxml", 3)
?myxml
STORE SQLCONNECT('xxxxxx') TO gnConnHandle
?gnConnHandle
?SQLEXEC(gnConnHandle, "exec dbo.aaa1 '"+myxml+"'")




Переменная myxml содержит значение

<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<VFPData>
<row f1="FFFF" f2="1.50"/>
<row f1="AAAAA" f2="2.50"/>
</VFPData>




Хранимая процедура
CREATE PROCEDURE dbo.aaa1
@myxml text
AS
DECLARE @hdoc INT, @ret INT
EXEC sp_xml_preparedocument @hdoc OUTPUT, @myxml OUTPUT
SELECT * FROM OPENXML(@hdoc, '//row') WITH(field1 nVARCHAR(20) '@f1', field2 decimal(10,2) '@f2')
EXEC sp_xml_removedocument @hdoc

GO
...
Рейтинг: 0 / 0
04.12.2003, 08:50
    #32342861
vklepko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачка данных на MS-SQL Server
А еще есть безумная идея закачивать данные через SQL-DMO(SQL-DMO входит в стандартный connectivity). Правда временные таблицы через него не видны, или я не нашёл как до них достучаться. А с обычными таблицами работает на ура.
Нижеприведённый пример требует наличия таблицы aaa(a1 int, a2 char(50)) в Northwind. 65536 записей закачиваются за считанные секунды.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#define _endl Chr( 13 )+Chr( 10 )
create cursor aaa ( a1 n( 10 ), a2 C( 50 ))
insert into aaa values( 0 , "")
insert into aaa values(0 ," ")
* Наберем данных побольше
for i = 1  to  4 
	select x1.a1, x1.a2;
	from "aaa " x1, " aaa " x2;
	into cursor " aaa " readwrite
endfor
* 65536  записй
replace all a1 with Recno(),a2 with "Field  "+Str(Recno())

?Datetime()
* файл данных на локальном компьютере
lcTXT = " c:\aaa.txt "
if File(lcTXT)
	erase(lcTXT)
endif
copy to (lcTXT) type delimited with character |

* format файл на локальном компьютере
lcFMT = " c:\aaa.fmt "
=StrToFile('8.0'+_endl,lcFMT)
=StrToFile('2'+_endl,lcFMT,.t.)
=StrToFile('1 SQLCHAR 0 10 "|\""    1 a1 SQL_Latin1_General_CP1_CI_AS'+_endl,lcFMT,.t.)
=StrToFile('2 SQLCHAR 0 50 "\"\r\n" 2 a2 SQL_Latin1_General_CP1_CI_AS'+_endl,lcFMT,.t.)

oSQLServer = CreateObject(" SQLDMO.SQLServer ")
oSQLServer.Connect(" server "," user "," pwd ")
oTable = oSQLServer.Databases(" Northwind ").Tables(" aaa ")

oBulkCopy = CreateObject(" SQLDMO.BulkCopy")
with oBulkCopy
	.ImportRowsPerBatch =  1000 
	.UseServerSideBCP = .f.     
	.DataFileType =  5 		
	.FormatFilePath = lcFMT
	.DataFilePath = lcTXT
	.SetCodePage(- 1 )
endwith

oTable.TruncateData()
oTable.ImportData(oBulkCopy)
?Datetime()

Пример очень приблизительный, но может пригодиться
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закачка данных на MS-SQL Server / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]