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

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

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

Спасибо.
...
Рейтинг: 0 / 0
Закачка данных на MS-SQL Server
    #32340322
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну например так
Код: 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
Закачка данных на MS-SQL Server
    #32340532
Newb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Работает и понятно.
Вот только если данных много тормозить не будет?
А можно ли (пардон за наивный вопрос) чтото типа "пакетной обработки" придумать?
...
Рейтинг: 0 / 0
Закачка данных на MS-SQL Server
    #32340640
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну можно еще строку заполняющую временную табличку сделать или передать XML и обработать его средствами сервера...Только врядли удастся добиться ощутимой прибавки производительности..
...
Рейтинг: 0 / 0
Закачка данных на MS-SQL Server
    #32340648
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сколько это много данных и зачем при этом использовать временную таблицу?
...
Рейтинг: 0 / 0
Закачка данных на MS-SQL Server
    #32341294
Newb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут одна проблема нарисовалась.
Если много полей, то способ указанный выше не работает. фокс 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
Закачка данных на MS-SQL Server
    #32341584
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое сообщение кидает фокс?
Проблема может быть только в ограничении 254 символа на консанту. В этом случае надо просто разбивать выражение
Код: plaintext
1.
m.lcSQL =  "insert #Tab1(Pole1, Pole2)" +;
               "values(?pole1,?pole2)"  

Я например в основном использую XML передавая его в хранимую процедуру.
Или просто собираю строку содержащую все insert.
OPENQUERY в вашем случае не очень удачное решение. Он работает только с локальными данными...
...
Рейтинг: 0 / 0
Закачка данных на MS-SQL Server
    #32341587
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу 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
Закачка данных на MS-SQL Server
    #32342861
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще есть безумная идея закачивать данные через 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
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Закачка данных на MS-SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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