Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Требуется загрузить строки из курсора на клиенте в таблицу на сервере. Опыта работы с MS SQL мало, потому может и не знаю каких-то техник для подобной задачи. Клиент написан на Visual FoxPro, сервер ms sql 2008/


Хотел сделать по алгоритму вызова хранимой процедуры для каждой строки курсора на клиенте, и записи этой строки во временную таблицу на сервере, потом по определенному условию данные из временной таблицы переносятся в основную таблицу.
Данные из временной таблицы должны быть видны для сеанса текущего подключения, но после выполнения процедуры в таблицу попадает только последняя строка
Подобный прием ранее реализовывал в Oracle, но там немного другой подход работы с временными таблицами.
Что я делаю не так?
CREATE PROCEDURE [dbo].[ins_cursor] 
 	@filed1 int, 
 	@filedN int, 
	@n_rec int,  --номер записи из курсора
	@reccount int -- кличество записей в курсоре
AS

BEGIN
	
	IF OBJECT_ID ('tempdb.dbo.#TEK_REST') IS  NULL
	BEGIN
		
		--создаем временную таБлицу если ее нет
		CREATE TABLE #tek_rest(	
				[field1] [int] NOT NULL,
				[fieldn] [int] NOT NULL						
	END
	--если это первая строка, то на случай сбой предыдущего сохранения очищаем таблицу, возможно эт лишнее
	if @n_rec=1 
		begin
			delete from dbo.#tek_rest
		end
	--записываем строку во временную таблицу
	insert into dbo.#tek_rest 
	(field1,fieldn)
	values
	(@field1,@fieldn)
	
	--если это последняя запись, то переносим данные из временной таблицы
	if @n_rec =@reccount 
		begin
			
			begin transaction		
			
			insert into dbo.tek_rest 
				([field1],[fieldn]) 			
				select [field1], [fieldn] from dbo.#tek_rest
			commit transaction
		
		end


END


Использование таблиц вида ## не подходит ,т.к. их данные будут доступны второй копии запущенной программы, т.е. сервер не изолирует данные только для соединения в котором она создана.
12 авг 13, 12:51    [14696067]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
vova_ukr_lg
Требуется загрузить строки из курсора на клиенте в таблицу на сервере.

Это вы так задачу сформулировали ?
12 авг 13, 12:52    [14696082]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Glory
vova_ukr_lg
Требуется загрузить строки из курсора на клиенте в таблицу на сервере.

Это вы так задачу сформулировали ?

это часть из моей задачи, сама задача состоит из расчета, результатом которой является курсор на клиенте. Перенести расчет на сервер сейчас реализовать не получится из-за ряда причин. Но итог расчета необходимо сохранять уже в БД на MS SQL, т.к. его будут использовать другие программы.
12 авг 13, 12:59    [14696144]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
vova_ukr_lg
это часть из моей задачи, сама задача состоит из расчета, результатом которой является курсор на клиенте. Перенести расчет на сервер сейчас реализовать не получится из-за ряда причин. Но итог расчета необходимо сохранять уже в БД на MS SQL, т.к. его будут использовать другие программы.

Курсор - это некий программный объект. У которого есть физический источник данных
12 авг 13, 13:02    [14696163]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Glory
vova_ukr_lg
это часть из моей задачи, сама задача состоит из расчета, результатом которой является курсор на клиенте. Перенести расчет на сервер сейчас реализовать не получится из-за ряда причин. Но итог расчета необходимо сохранять уже в БД на MS SQL, т.к. его будут использовать другие программы.

Курсор - это некий программный объект. У которого есть физический источник данных

У курсора есть несколько физических источников данных из которых он был сформирован. В моем случае часть источников это результаты обращений к представлениям к MS SQL серверу, часть это результаты обращений к таблицам dbf (FoxPro).
12 авг 13, 13:06    [14696201]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
vova_ukr_lg
У курсора есть несколько физических источников данных из которых он был сформирован. В моем случае часть источников это результаты обращений к представлениям к MS SQL серверу, часть это результаты обращений к таблицам dbf (FoxPro).

Т.е. вы хотите на основе запроса "к представлениям MS SQL и таблицам dbf (FoxPro)" сделать рассчеты и загрузить результаты обратно в MS SQL ?
12 авг 13, 13:12    [14696271]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Glory
vova_ukr_lg
У курсора есть несколько физических источников данных из которых он был сформирован. В моем случае часть источников это результаты обращений к представлениям к MS SQL серверу, часть это результаты обращений к таблицам dbf (FoxPro).

Т.е. вы хотите на основе запроса "к представлениям MS SQL и таблицам dbf (FoxPro)" сделать рассчеты и загрузить результаты обратно в MS SQL ?

Да, это уже реализовано. На сервер частично перенесены справочные данные (их и получаю через представления), а остальная информация пока хранится в таблицах dbf. Но результат вычисления, необходимо сохранять на сервер.
12 авг 13, 13:19    [14696320]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
vova_ukr_lg,

почему бы не загрузить всё из файла .dbf в таблицу на сервере,
после чего работать уже только с MSSQL?

И забыть слово "курсор".

На клиенте тоже можно сформировать запрос по вставке данных в таблицу,
исходя из данных, накопленных на клиенте.
В цикле по записям DataSetа или по строкам грида, например.
12 авг 13, 13:26    [14696375]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
iap
vova_ukr_lg,

почему бы не загрузить всё из файла .dbf в таблицу на сервере,
после чего работать уже только с MSSQL?

И забыть слово "курсор".

На клиенте тоже можно сформировать запрос по вставке данных в таблицу,
исходя из данных, накопленных на клиенте.
В цикле по записям DataSetа или по строкам грида, например.


Все загрузить не получится, т.к. данные используются и обрабатываются несколькими программами, на переписывание которых не хватает времени и людей.
Записывать все по одной записи можно, но тогда теряется возможность использования транзакций, по этой причине и хотелось сначала подготовить данные на сервере, а потом эту выборку после пары проверок ( в примере их убрал) одной транзакцией перенести в таблицу.
12 авг 13, 13:34    [14696437]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
vova_ukr_lg
iap
vova_ukr_lg,

почему бы не загрузить всё из файла .dbf в таблицу на сервере,
после чего работать уже только с MSSQL?

И забыть слово "курсор".

На клиенте тоже можно сформировать запрос по вставке данных в таблицу,
исходя из данных, накопленных на клиенте.
В цикле по записям DataSetа или по строкам грида, например.


Все загрузить не получится, т.к. данные используются и обрабатываются несколькими программами, на переписывание которых не хватает времени и людей.
Записывать все по одной записи можно, но тогда теряется возможность использования транзакций, по этой причине и хотелось сначала подготовить данные на сервере, а потом эту выборку после пары проверок ( в примере их убрал) одной транзакцией перенести в таблицу.
Что за ерунда?!
Кто мешает записывать не по одной записи, а сразу все?
А если по одной, то в начале скрипта начать транзакцию?
12 авг 13, 13:54    [14696618]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
iap
vova_ukr_lg
пропущено...


Все загрузить не получится, т.к. данные используются и обрабатываются несколькими программами, на переписывание которых не хватает времени и людей.
Записывать все по одной записи можно, но тогда теряется возможность использования транзакций, по этой причине и хотелось сначала подготовить данные на сервере, а потом эту выборку после пары проверок ( в примере их убрал) одной транзакцией перенести в таблицу.
Что за ерунда?!
Кто мешает записывать не по одной записи, а сразу все?
А если по одной, то в начале скрипта начать транзакцию?

Не совсем понял, можно пример?
12 авг 13, 14:02    [14696680]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
vova_ukr_lg
iap
пропущено...
Что за ерунда?!
Кто мешает записывать не по одной записи, а сразу все?
А если по одной, то в начале скрипта начать транзакцию?

Не совсем понял, можно пример?
Пример чего?
INSERT SELECT ?
BEGIN TRANSACTION?

Вообще, вопрос скорее по клиенту.
Сервер, кажется, не при чём?
12 авг 13, 14:15    [14696797]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
iap
vova_ukr_lg
пропущено...

Не совсем понял, можно пример?
Пример чего?
INSERT SELECT ?
BEGIN TRANSACTION?

Вообще, вопрос скорее по клиенту.
Сервер, кажется, не при чём?

т.е. с клиента запускать команды начала транзакции, потом вставки и далее завершение транзакции? я ориентировался все оформить в виде хранимой процедуры, но если такое нереализуемо, попробую предложенный вами вариант.
12 авг 13, 14:21    [14696863]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
vova_ukr_lg
я ориентировался все оформить в виде хранимой процедуры, но если такое нереализуемо, попробую предложенный вами вариант.

Вы надеялись, что серверная процедура обратится в память клиентского приложения за данными курсора ?
12 авг 13, 14:29    [14696926]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
qwerty112
Guest
vova_ukr_lg
т.е. с клиента запускать команды начала транзакции, потом вставки и далее завершение транзакции? я ориентировался все оформить в виде хранимой процедуры, но если такое нереализуемо, попробую предложенный вами вариант.

даа, оно-то - реализуемо:
- сериализовать рекордсет/курсор в хмл и передать его (этот хмл) серверу как параметр ХП

просто непонятно, зачем делать "сложно", если можно сделать "просто" ...
12 авг 13, 14:30    [14696928]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
qwerty112
vova_ukr_lg
т.е. с клиента запускать команды начала транзакции, потом вставки и далее завершение транзакции? я ориентировался все оформить в виде хранимой процедуры, но если такое нереализуемо, попробую предложенный вами вариант.

даа, оно-то - реализуемо:
- сериализовать рекордсет/курсор в хмл и передать его (этот хмл) серверу как параметр ХП

просто непонятно, зачем делать "сложно", если можно сделать "просто" ...

Недостаток опыта в t-sql. PL/SQL позволял наполнить временную таблицу и потом перенести данные, причем данные во временной таблице видны в текущем подключении, в другом подключении их не видно (разграничивает сервер). Вот и хотел подобный механизм использовать. t-sql, точнее MS SQL сервер работает с временными таблицами иначе, поэтому и мой алгоритм не подошел.
12 авг 13, 14:36    [14696969]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
qwerty112
Guest
vova_ukr_lg
qwerty112
пропущено...

даа, оно-то - реализуемо:
- сериализовать рекордсет/курсор в хмл и передать его (этот хмл) серверу как параметр ХП

просто непонятно, зачем делать "сложно", если можно сделать "просто" ...

Недостаток опыта в t-sql. PL/SQL позволял наполнить временную таблицу и потом перенести данные, причем данные во временной таблице видны в текущем подключении, в другом подключении их не видно (разграничивает сервер). Вот и хотел подобный механизм использовать. t-sql, точнее MS SQL сервер работает с временными таблицами иначе, поэтому и мой алгоритм не подошел.

в MS SQL, это (выделил) - выглядит точно так как вы написали !
12 авг 13, 14:38    [14696981]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
vova_ukr_lg
t-sql, точнее MS SQL сервер работает с временными таблицами иначе, поэтому и мой алгоритм не подошел.

Точно так же он работает
Просто вы с чего вдруг бросились писать процедуру
12 авг 13, 14:39    [14696988]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Glory
vova_ukr_lg
t-sql, точнее MS SQL сервер работает с временными таблицами иначе, поэтому и мой алгоритм не подошел.

Точно так же он работает
Просто вы с чего вдруг бросились писать процедуру

тогда я что-то упустил. в другом проекте (VFP+Oracle) создавалось подключение и в нем вызывалась (несколько раз - смотря сколько строк) хранимая процедура которая на вход получала строку (набор переменных) их она помещала во временную таблицу (сессионную). Когда все загружено данные переносились в основную таблицу. данные из временной таблицы в другой сессии были не видны (может я ошибаюсь и это не так), в другом подключении. Здесь же в таблица # живет до конца работы процедуры, и ее данные видны только из процедуры, а таблица ## не очищается после после окончания процедуры (то что нужно), но ее данные видны из других сеансов (а это мне не подходит). Можно конечно в таблицу добавить идентификатор сеанса/ подключения и по нему ориентироваться, но хотелось бы без подобных велосипедов.
12 авг 13, 15:07    [14697213]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Glory
Просто вы с чего вдруг бросились писать процедуру

Привычка писать в клиент-серверных приложениях по принципу клиент отображает данные, а все операции добавления/изменения делать через хранимые процедуры. На клиенте только делать вызов ХП. Но правда в текущем проекте получается мешанина файл-сервера, клиент-сервера.
12 авг 13, 15:11    [14697244]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Glory
Member

Откуда:
Сообщений: 104760
vova_ukr_lg
Здесь же в таблица # живет до конца работы процедуры

Потому что таблица там же и создана.
12 авг 13, 15:11    [14697248]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
vova_ukr_lg
Member

Откуда:
Сообщений: 80
Glory
vova_ukr_lg
Здесь же в таблица # живет до конца работы процедуры

Потому что таблица там же и создана.

я ориентировался на опыт работы с ORACLE, это моя ошибка. в Oracle таблица можно создать заранее, в момент проектирования как обычную, но с настройками указывающими что она временная и далее использовать как я описывал.
Сейчас все реализовал вызовом

begin transaction

цикл вызовов insert

commit transaction
12 авг 13, 15:21    [14697355]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
vova_ukr_lg,

если временную #таблицу создать до вызова процедуры,
то она будет видна и внутри процедуры.
(Если в процедуре не создать таблицу с таким же именем).
Такая таблица не будет удалена при завершении процедуры.
12 авг 13, 15:32    [14697468]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
eny
Member

Откуда: москва
Сообщений: 292
iap
vova_ukr_lg,

если временную #таблицу создать до вызова процедуры,
то она будет видна и внутри процедуры.
(Если в процедуре не создать таблицу с таким же именем).
Такая таблица не будет удалена при завершении процедуры.


1. во-во процедура в процедуре и будет Вам счастье, и в Oracle тоже самое, блок begin/end - анонимная процедура, как и в t-sql

2. а еще есть в ms-sql фича OPENRECORDSET - можно данные грести в селекте прямо из dbf-а и не заморачиваться
12 авг 13, 15:42    [14697538]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка курсора на сервер  [new]
Empirical
Member

Откуда:
Сообщений: 99
qwerty112
причем данные во временной таблице видны в текущем подключении, в другом подключении их не видно (разграничивает сервер).


имя временной таблицы должно начинаться с ## и тогда она будет доступна глобально
12 авг 13, 15:45    [14697549]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить