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

Откуда: г. Москва
Сообщений: 71
есть два сервера, на первом попытка выполнить запрос
declare @histItog table (ID INT, FromD DATETIME, ToD DATETIME, DayInSale int,  ProdanoQ int, Prodano INT, Income INT, Vozvrat INT, Ostatok INT) 

INSERT into @histItog
EXECUTE SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog @idCli, @idBook
выдает ошибку
Msg 3930, Level 16, State 1, Line 10
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
причем недавно работало, чего на серверах поменяли сказать не смогу :(
без insert как и положено получаю таблицу, но мне то ее дальше надо юзать
т.е. результат работы со второго сервера мне надо передать на первый. как это можно сделать?

сервера:
Microsoft SQL Server 2008 (SP1) - 10.0.2757.0 (X64) Jan 8 2010 19:55:08 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) Apr 14 2006 01:12:25 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
17 авг 10, 17:15    [9277777]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Ищите (например, профайлером), какая ошибка возникает в процедуре SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog и делает транзакцию uncommitable.
17 авг 10, 17:24    [9277848]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
DeColo®es
Ищите (например, профайлером), какая ошибка возникает в процедуре SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog и делает транзакцию uncommitable.


там ошибок нет
последняя как команда, как и в случае без insert
select ID, FromD, ToD, DneyInSale, ProdanoQ, Prodano, Income, Vozvrat,Ostatok--,Income-isnull(Vozvrat,0)-isnull(Ostatok,0) AS ProdanoCalc--,NULL, *
	from @histItog
17 авг 10, 17:39    [9277979]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
утды
Guest
а просто
EXECUTE SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog @idCli, @idBook
без insert , конечно, тоже падает

см. linked server
17 авг 10, 17:44    [9278014]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
утды

без insert , конечно, тоже падает

и не конечно и не падает, работает как часики :)

мало того, выяснил что еще и от данных зависит, т.е. есть пара параметров при которых вызов провецеду с insert замечательно выполняется без намека на ошибку
17 авг 10, 17:51    [9278080]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timchik,

вы знаете, что такое нефиксируемая транзакция? Вот такая вот у вас и возникает. Когда делается insert exec, процедура выполняется внутри транзакции, а просто вызов может выполняется без транзакций. Соответственно внутри вашей процедуры происходит ошибка, но без транзакции вы ее просто игнорируете.
17 авг 10, 17:55    [9278104]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
iljy,
про транзакции догадываюсь. с нефиксируемыми еще не встречался

пошаговое выполнение ее на втором серваке идет без ошибок.
вставил принт в последнюю строку после select а в процедуре на первом принт появился перед сообщением об ошибке
17 авг 10, 18:08    [9278169]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Glory
Member

Откуда:
Сообщений: 104751
Timchik
утды

без insert , конечно, тоже падает

и не конечно и не падает, работает как часики :)

мало того, выяснил что еще и от данных зависит, т.е. есть пара параметров при которых вызов провецеду с insert замечательно выполняется без намека на ошибку

А
BEGIN TRANSACTION
EXECUTE SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog @idCli, @idBook
COMMIT TRANSACTION

тоже работает ?
17 авг 10, 18:09    [9278176]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
Glory

BEGIN TRANSACTION
EXECUTE SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog @idCli, @idBook
COMMIT TRANSACTION

тоже работает ?


да :(
17 авг 10, 18:24    [9278225]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
BEGIN DISTRIBUTED TRANSACTION ? ;)

INSERT EXEC - глючная конструкция, попробуйте извратиться или через OUT параметры, или временную таблу.

Были такие же проблемы. Разве что реальной причины не описал.
17 авг 10, 18:25    [9278231]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
Mnior,
OUT не канает, у меня там таблица, а 2005 не поддерживает их в параметрах :(
а через временные... это внутри процедуры создавать #temp а потом с другого сервера ее читать?
17 авг 10, 18:42    [9278299]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
мсв
Guest
"работает\не работает" - это скорее всего преобразование типов или not null

сделайте временную с nvarchar(nn) null полями и заливайте в неё

потом уж разберётесь - что там с данными
17 авг 10, 20:45    [9278701]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Timchik
OUT не канает, у меня там таблица, а 2005 не поддерживает их в параметрах :(
1. Вы так говорите, словно где-то канает. OUT таблиц быть не может, разве что курсор, как сложных типов данных с линкед-серверами и т.п..
2. И почему именно таблицы передавать.

Timchik
а через временные... это внутри процедуры создавать #temp а потом с другого сервера ее читать?
На счёт чисто временных забудьте, сглупил по невнимательности (на своей волне). Можете и временные на удалённом использовать, а можете и обыкновенные. Делайте как вам удобно.

Короче, стараюсь не делать как попало, и придерживаться некоторых правил и поэтому на такие косяки нарываюсь реже. Процедуры надо использовать, только для изменения в БД, да и вообще редко пользоваться (они более для критичных мест). Для возврата табличных результатов стараться также не использовать. Код без них становится максимально юзабельным и контролируемым и более эффекивным. Использование процедур это бич многих. MS любит более декларативный подход и с компилируемыми объектами у него много косяков.

А. Если у вас spSelBookHistSaleItog делает только запросы к данным, то у вас подход не верный, нужно было это через функции делать.
Ах да, IMXO. :)

Б. Если нет, то надо на самом линкеде делать не обрубок меж-базового взаимодействия, а полноценный функционал, которому должно быть по барабану, взяли обработанные данные или нет, как и каким способом взяли, т.е. обработать и сохранить, остальное не его забота.
Т.е. всегда отделять мух (EXEC) от котлет (SELECT). :) Ну во всяком случае стараться.
17 авг 10, 20:54    [9278733]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
Mnior,
автор
Можете и временные на удалённом использовать, а можете и обыкновенные.

с временными, не совсем понимаю как к ним обращаться
select * from SQLSVR2..dbo.#histItog
пьлёют на SQLSVR2. и ищет таблицу, похоже, на локальном сервере.
в данном случае видимо на втором сервере создам обыкновенную таблицу с одном доп полем SPID
и в нее буду заливать данные, и по спиду обратно фильтровать-читать-чистить.
или есть более изящные решения?
18 авг 10, 09:49    [9280196]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
Mnior,
Mnior
Вы так говорите, словно где-то канает. OUT таблиц быть не может

канает :) в 2008, если я правильно понял, можно обратно вернуть таблицу через OUT параметр, используя TYPE
18 авг 10, 09:51    [9280209]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timchik
Mnior,
Mnior
Вы так говорите, словно где-то канает. OUT таблиц быть не может

канает :) в 2008, если я правильно понял, можно обратно вернуть таблицу через OUT параметр, используя TYPE

Неправильно поняли
БОЛ-Возвращающие табличное значение параметры

Ограничения
Возвращающие табличные значения параметры имеют следующие ограничения.

SQL Server не ведет статистику столбцов возвращающих табличные значения параметров.


Возвращающие табличные значения параметры должны передаваться процедурам Transact-SQL как входные параметры типа READONLY. Над возвращающими табличные значения параметрами, находящимися в теле процедуры, нельзя выполнять операции DML, такие как UPDATE, DELETE или INSERT.


Возвращающий табличное значение параметр не может быть использован в качестве цели для инструкции SELECT INTO или INSERT EXEC. Возвращающий табличное значение параметр может присутствовать в предложении FROM инструкции SELECT INTO или в строке или хранимой процедуре INSERT EXEC.
18 авг 10, 09:59    [9280262]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
iljy,

насколько я понял, это ограничения на вызывающем сервере.
а внутри самой процедуры можно в нее и insert сделать. а после вызова уже только select
18 авг 10, 10:33    [9280513]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timchik
iljy,

насколько я понял, это ограничения на вызывающем сервере.
а внутри самой процедуры можно в нее и insert сделать. а после вызова уже только select

?? Это откуда такой вывод?? Вот эта фраза
Над возвращающими табличные значения параметрами, находящимися в теле процедуры, нельзя выполнять операции DML, такие как UPDATE, DELETE или INSERT.

ничего вам не говорит?
18 авг 10, 11:06    [9280778]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Glory
Member

Откуда:
Сообщений: 104751
В процедуре есть ? SET XACT_ABORT on ? TRY CATCH ?
18 авг 10, 11:15    [9280856]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
Glory
В процедуре есть ? SET XACT_ABORT on ? TRY CATCH ?

нет. а нужны?
18 авг 10, 20:24    [9285928]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Crimean
Member

Откуда:
Сообщений: 13147
проблема передачи данных между серверами, имхо, никак не решена до сих пор
я локально закрываю через свою dll, которая по odbc ходит к другому серверу
так odbc глючит на 2003 / xp платформе в последних версиях жостко
похоже, надо уходить на свой сервис, но это инсталить и сопровождать дополнительно + с безопасностью решать..
а так - блобы нельзя, xml нельзя, попытка забрать результат во времянку сходу натыкается на DTC и привет..
реального решения после того, как отрубили ремоут сервера и возможность управлять открытием транзакции при межсерверном RPC я не вижу до сих пор
18 авг 10, 20:29    [9285939]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Timchik, неужели ваша процедура что-то меняет на сервере, если нет сделайте вместо неё (или на худой конец рядом) функцию и не парьтесь с таблицами.

С временными ... возможно никак или тоже извратно. И SPID некрасивый кастыль, да и зачем? Неужели сами @idCli, @idBook не канают?
18 авг 10, 21:22    [9286087]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Timchik
Member

Откуда: г. Москва
Сообщений: 71
Mnior,
функция есть, но вызов ее с другого сервера возвращает
Msg 4122, Level 16, State 1, Line 4
Remote table-valued function calls are not allowed.
19 авг 10, 16:49    [9292005]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Timchik
функция есть, но вызов ее с другого сервера возвращает
Msg 4122, Level 16, State 1, Line 4
Remote table-valued function calls are not allowed.
Чёрд, рушится карточный домик ...
Вот даже есть Suggestion на этот "баг".

А inline функцию (параметризованное представление) не получается написать? Ну тогда осталось:
BEGIN TRANSACTION

EXEC SQLSVR2.BookRevises.dbo.spSelBookHistSaleItog_materialize @idCli, @idBook

INSERT ...
SELECT ...
FROM SQLSVR2.BookRevises.dbo.tbSelBookHistSaleItog
WHERE  idCli = @idCli AND idBook = @idBook

COMMIT TRANSACTION
Не знаю как у вас там, синглетон или параллельно множество запросов (с теми же параметрами).

Кстати, а вам эскалация транзакции до меж-серверного взаимодействия нужна? Если вы оттуда только данные получаете. Если нет, можно попробывать заюзать без-транзакционный линк к удалённому серверу, может ошибки и не будет.

Можно ещё динамику через OpenQuery, но это то ещё извращение.
19 авг 10, 20:42    [9293205]     Ответить | Цитировать Сообщить модератору
 Re: insert into exec не пашет  [new]
Crimean
Member

Откуда:
Сообщений: 13147
> можно попробывать заюзать без-транзакционный линк к удалённому серверу
> может ошибки и не будет.

эээ... а это как сделать?

> Можно ещё динамику через OpenQuery, но это то ещё извращение

я-я и все равно по-моему попадаем на DTC :)
19 авг 10, 20:51    [9293219]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить