powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Простой SELECT инвалидирует транзакцию
11 сообщений из 11, страница 1 из 1
Простой SELECT инвалидирует транзакцию
    #39996645
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму от чего вдруг такая особенность поведения и как ее можно обойти

Имеется sp, которая зовет динамический SQL типа
Код: sql
1.
2.
3.
4.
5.
6.
WITH t AS
 ( select count(*) AS cnt from (SELECT * from ( бла-бла-бла I
) sub3 
except 
SELECT * From бла-бла-бла II ) sub )
SELECT @DataCompareCount=(T.cnt) FROM  T; 



Примерно так
Код: sql
1.
exec sp_executesql  @Query  = @sql_data_comp, @Params = N'@DataCompareCount smallint OUTPUT' ,@DataCompareCount   = @DataCompareCount   OUTPUT;



В общем не суть важно, что там за таблицы и синтакс, все там нормально.
Между двумя запросами except. Он читает результат в переменную @DataCompareCount.
Если же структуры запросов чуть не совпадают, типа у одного в первой колонке int, а у второго Date, то возникает Conversion error. Логично. Я этот exception ловлю.

Но засада в том, что эта sp зовется в рамках транзакции извне. И из-за банального неправильного selecta-а XACT_STATE валится в -1 и я больше ничего не могу сделать в этой sp, например проапдейдить таблицу, записав туда "Структуры запросов не совпадают".
Ибо
Код: sql
1.
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.



Попробовал искомую таблицу в память переместить, так нет, у меня видите ли, кое-где в коде встречается другая БД! А при таких условиях https://www.sqlservercentral.com/forums/topic/memory-optimized-tables-cross-db-access.

Подумал сразу об автономных транзакциях через loopback (в этом месте ораклисты смеются обычно)
Еще вариант гугл советует - CLR.

Но все же, может быть есть ли варианты попроще?
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996651
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS:

Точнее, понятно, почему транзакция инвалидируется с точки зрения документации. Непонятно с т.зр здравого смысла.
Вопрос -есть ли какой-то хитрый метод это обойти без особого дополнительного кодинга.
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996652
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski,

Что мешает добавить проверку типов по словарю вместо падения по ошибке?
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996665
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski
Но все же, может быть есть ли варианты попроще?
Нет.
Ещё можно в приложении анализировать ошибку, и "проапдейдить таблицу, записав туда "Структуры запросов не совпадают"".

Обработчик ошибок в сиквеле плохой, и автономных транзакций тоже нет, проектируйте архитектуру исходя из этого, ничего не поделать.
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996667
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski,

В целом архитектура вычитания звёздочек выглядит "альтернативно одарённой", может стоит что-то поменять в консерватории?
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996671
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Glebanski,
Что мешает добавить проверку типов по словарю вместо падения по ошибке?

Пройденный этап.
Если одном датасете Attr = 1 ,и в другом тоже 1, то это прекрасно.
Но если первый smalltint , а второй вдруг int , то кирдык сравнению типов по словарю
В целом архитектура вычитания звёздочек выглядит "альтернативно одарённой", может стоит что-то поменять в консерватории?
Это специально. Не фиг колонки местами путать.

Нет...
Обработчик ошибок в сиквеле плохой, и автономных транзакций тоже нет,

Спасибо, жаль что опасения оправдались. Думаю теперь сбацаю sp апдейтить логи. И если XACT_STATE=-1 звать ее через linked server. В остальных случаях - по старому. Жаль, что через ж... Ну чтож поделать
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996678
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski
Но все же, может быть есть ли варианты попроще?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 1
except
select sysdatetime();
go

select cast(1 as sql_variant)
except
select cast(sysdatetime() as sql_variant);
go
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996691
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 1
except
select sysdatetime();
go

select cast(1 as sql_variant)
except
select cast(sysdatetime() as sql_variant);
go


Вот конкретно так наверно не сработает, потому что надо будет запросы парсить и каждую колонку обрамлять в cast.
Но вообще это навело меня на другую мысль. Спасибо
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996699
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski
Вот конкретно так наверно не сработает, потому что надо будет запросы парсить и каждую колонку обрамлять в cast.
Достаточно генерировать для каждой таблицы соответствующее представление и использовать его в запросах.
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996772
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эээ...?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Declare @s nvarchar(max) = N'
Select 1 as t 
except
Select Cast(''20200101'' as date) as t'

Begin try
exec sp_describe_first_result_set @s 
End try
Begin Catch

	Select 1
End Catch
...
Рейтинг: 0 / 0
Простой SELECT инвалидирует транзакцию
    #39996853
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Вариант интересный, но
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Declare @s1 nvarchar(max) = N'
Select N''asv'' as t1
except
Select Cast(''20200101'' as date)'
Begin try
exec sp_describe_first_result_set @s1 
End try
Begin Catch
	Select 1
End Catch


Никаких exceptions

А сам запрос ессно дает ошибку:
Код: sql
1.
2.
3.
Select N'asv' as t1
except
Select Cast('20200101' as date)



В общем я пока склоняюсь к варианту создания двух table variable со всеми полями типа sql_variant. Буду тестить.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Простой SELECT инвалидирует транзакцию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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