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

Откуда: Москва
Сообщений: 5381
Есть ХП с SELECT запросом.
+
create procedure [StrangerRegistryDetail]
	@DateStart datetime,
	@DateEnd datetime,
	@idLpu numeric
as
begin
	set nocount on;
	
	declare @ShowUnpaid int
	select
		@ShowUnpaid = SettingsValue
	from AloneSettings
	where SettingsName = 'UnpaidServ'

	select
		Talon.idTalon,
		ServiceName,
--		K = case when A.idService is not null then Servitm.K else 0.0 end,
		Servitm.K,
		Servitm.K * Servitm.Price as Price,
		Servitm.DateVisit
	from vStranger --with(noexpand)
		join Persons on vStranger.idPerson = Persons.idPerson
		join Patient on Persons.idPerson = Patient.idPerson and Patient.IsDeleted = 0
			and (@idLpu is null or Patient.idLpu = @idLpu)
		join Talon on Patient.idPatient = Talon.idPatient and Talon.IsDeleted = 0 
			and Talon.DateTalon between @DateSTart and @DateEnd
		join Servitm on Talon.idTalon = Servitm.idTalon and Servitm.IsDeleted = 0
		join Service on Servitm.idService = Service.idService
		outer apply(
			select top 1 idService
			from DentService
			where idService = Service.idService
		) A
	where (Servitm.K * Servitm.Price > 0 or @ShowUnpaid = 1)
	order by Talon.idTalon, Servitm.DateVisit
END
Из SSMS выполняется без ошибок, а из клиентского приложения дает исключение:
---------------------------
Error
---------------------------
Поставщик данных или другая служба вернули E_FAIL.
---------------------------
OK   Details >>   
---------------------------
Самое любопытное, что если убрать outer apply (а он теперь не нужен), то все работает. Понимаю, что ошибка клиентская, но стало любопытно: при чем здесь outer apply? Кто-нибудь сталкивался с таким? Сюр какой-то...
25 июн 10, 14:22    [9002371]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Glory
Member

Откуда:
Сообщений: 104751
Поставщик данных или другая служба вернули E_FAIL.
А где здесь серверное сообщение про ошибку OUTER APPLY ?
25 июн 10, 14:24    [9002393]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Дополнение. Такая ошибка появляется при подключении через поставщика OLEDB для MSSQL. Через SQL Native Client получаю "Ошибка связи".
25 июн 10, 14:24    [9002406]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Glory
Поставщик данных или другая служба вернули E_FAIL.
А где здесь серверное сообщение про ошибку OUTER APPLY ?
Я знаю, что ошибка не серверная. Спросил здесь, потому что здесь больше участников работают с MSSQL, чем, например, в форуме по Делфи. Кстати, для доступа используются компоненты ADO.
25 июн 10, 14:27    [9002434]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2566
Senya_L
Glory
Поставщик данных или другая служба вернули E_FAIL.
А где здесь серверное сообщение про ошибку OUTER APPLY ?
Я знаю, что ошибка не серверная. Спросил здесь, потому что здесь больше участников работают с MSSQL, чем, например, в форуме по Делфи. Кстати, для доступа используются компоненты ADO.
в ADO замечен такой глюк, в случае с APPLY приходилось пихать подзапросы в SELECT...
25 июн 10, 14:57    [9002775]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Senya_L
Member

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

Ну хоть не у меня одного такой глюк.
У меня еще немало запросов с OUTER/CROSS APPLY. В них такой ошибки замечено не было. Складывается впечатление, что ADO "не любит" OUTER APPLY, из которого ни одного столбца не задействовано в списке SELECT.
25 июн 10, 15:23    [9003051]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
переходите на .Net вместо АДО
25 июн 10, 15:29    [9003109]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
Senya_L,

У меня такое бывало. И именно в таких случаях.
Видимо у ADO проблемы с получением метаданных в этом некорректно написанном запросе:

join Service on Servitm.idService = Service.idService
outer apply(
select top 1 idService
from DentService
where idService = Service.idService) A

Для поля idService нужно уазать полное имя. Меня и в моем случае удивляло, почему не возникает ошибка неоднозначности имени, а запрос как-то выполняется.
27 июн 10, 14:16    [9008047]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Вставьте результат вашего запроса во времянку и из нее выбирайте. Если уж адо не понимает это.
27 июн 10, 14:26    [9008069]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
Гавриленко Сергей Алексеевич,

Мне кажется, в данном конкретном случае вопрос в том, почему SQL-server такой запрос понимает и выполняет.
27 июн 10, 14:33    [9008077]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
VladimirKr
Гавриленко Сергей Алексеевич,

Мне кажется, в данном конкретном случае вопрос в том, почему SQL-server такой запрос понимает и выполняет.
Если у поля в подзапросе не задан алиас или имя таблицы,
то сервер сам находит таблицу, к которой относится данное поле.
Сначала ищет внутри подзапроса, а если там такой таблицы нет, то в основном запросе.
В данном случае idService есть в DentService, поэтому именно эта таблица и подразумевается.
Запрос написан корректно.
Но, IMHO, алиас таблицы у всех полей надо бы писать явно.
Чтобы не пришлось потом искать самому, из какой же таблицы данное поле.
27 июн 10, 16:06    [9008230]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
VladimirKr
Меня и в моем случае удивляло, почему не возникает ошибка неоднозначности имени, а запрос как-то выполняется.
Напрасно Вы удивлялись. OUTER APPLY вроде бы нет в стандарте, но по аналогии с обычными подзапросами никакой неоднозначности нет. Всю жизнь писал примерно так
select
    ........
from Service
where exists(
  select * from DentService where idService = Service.idService
)
и никакой неоднозначности тут нет. Наоборот, в данном случае явное указание DentService.idService считаю избыточным. Имхо, есессьно.

ЗЫ. А насчет ошибки с OUTER APPLY интерес был так сказать академическим. Как я говорил, этому запросу устраивал ревизию и OUTER APPLY стал не нужен в связи с изменившимися требованиями.
27 июн 10, 19:04    [9008437]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Глючит OUTER APPLY  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
Подниму тему.
SQL 2005 Enterprise 4035. На Win 2003. Работает круглосуточно. Сисадмин уверяет, что никаких обновлений в системе в ближайшую неделю не было.
Два часа назад полезла эта ошибка. Ровно так же как и было описано в начале топика. Outer apply и OleDb E_Fail. На всех клиентских машинах (здесь и W7 и XP в домене и даже пара машин с XP не в домене) в приложении, которое до этого работало 4 месяца без изменений.
DBCC всех баз показывает норму. Перезагрузка сервера не дала эффекта.
Сейчас в спешном порядке ставится SP4. Но, блин, почему-то есть сомнения, что это поможет.

Кто нибудь сталкивался?
28 фев 13, 23:16    [13996477]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1062
Уточнение:
outer apply (select Top 1 бла-бла..)

с другими outer apply все в порядке
28 фев 13, 23:28    [13996521]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Глючит OUTER APPLY  [new]
mrGuest
Guest
Добавлю в копилку.

Подключение к SQL Server 2005 с помощью ADO, через драйвер SQLOLEDB.1
Машина Win7, версия драйвера 6.01.7601.17514

Пытаемся выполнить процедуру содержащую запрос:

select	...
from	Contacts
	outer apply (
		select	phone_num + '; '
		from	Phones
		where	Phones.contact_id = Contacts.contact_id
		for xml path('')
	) as Phones(phone_str)


Ошибок нет.

Теперь пытаемся добавить внутрь outer apply справочник из другой базы:

select	...
from	Contacts
	join ...

	outer apply (
		select	phone_num + '; '
		from	Phones
			join Dictionary.dbo.Regions on Regions.code = Phones.code
		where	Phones.contact_id = Contacts.contact_id
		for xml path('')
	) as Phones(phone_str)


Получаем на клиенте сообщение:
"На SQL Server возникла неизвестная ошибка. Возможно, сервер завершил соединение."

Пришла мысль попробовать перенести справочник Regions из другой базы в текущую.
Переносим. Убираем из запроса "Dictionary.dbo." Заработало без ошибок.


На тему ошибок E_FAIL, тоже не раз ловили. Проблема всегда решается переписыванием outer/cross apply на "более правильный" вариант.

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

Приведу простой пример для получения E_FAIL:
create procedure _test
as
begin
	select	1
	from	sys.objects
		outer apply (
			select	1
			from	sys.schemas
			where	1=0
		) as T (i)
end


Теперь попробуем выполнить эту процедуру из клиента:
procedure TForm1.Button1Click(Sender: TObject);
var
  adq: TADOQuery;
begin
  adq := TADOQuery.Create(nil);
  try
    adq.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=****;Data Source=****';
    adq.SQL.Text := 'exec _test';
    adq.Open();
    ShowMessage('test ok');
  finally
    adq.Free();
  end;
end;


Протестировано на:
Win7, версия драйвера 6.01.7601.17514 - Поставщик данных или другая служба вернули состояние E_FAIL.
Vista, версия драйвера 2000.85.1132.00 - test ok
Server 2003 R2, версия драйвера 2000.86.3959.00 - [DBNETLIB][ConnectionRead (recv()).]General network error. Check your network documentation.
XP, версия драйвера 2000.85.1132.00 - test ok
7 авг 14, 10:10    [16410030]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Glory
Member

Откуда:
Сообщений: 104751
mrGuest
Win7, версия драйвера 6.01.7601.17514 - Поставщик данных или другая служба вернули состояние E_FAIL.
Vista, версия драйвера 2000.85.1132.00 - test ok
Server 2003 R2, версия драйвера 2000.86.3959.00 - [DBNETLIB][ConnectionRead (recv()).]General network error. Check your network documentation.
XP, версия драйвера 2000.85.1132.00 - test ok

Вы озаботились тестированием совместимости старых драйверов с новыми версиями MSSQL ?
Не пробовали использовать нативный драйвер той же версии, что и продукт ?
7 авг 14, 10:49    [16410288]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Сон Веры Павловны
Member

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

Попробуйте выставить
ADOQuery.LockType = ltReadOnly

Драйвер для предположительно обновляемых (не помеченных как readonly в среде разработки, даже если они фактически необновляемые) запросов перед самим запросом выдает инструкцию SET NO_BROWSETABLE ON (проверено профайлером), которая и приводит к ошибке. Сама эта инструкция вроде как недокументированная:
"SET NO_BROWSETABLE ON is an undocumented option performed for Remote Data Service (RDS) ActiveX Data Connector (ADC) connections to SQL Server. Enabling this option makes every SELECT statement act as though FOR BROWSE had been appended to the statement, but bypasses the temporary table that FOR BROWSE normally pipes the results through. The net effect is to add keys and timestamps to the query as hidden output columns so the client can update specific rows (updateable cursors) without separate trips to the server to pick up the metadata and using the query to get the appropriate columns."

( http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27201 ), частично информация есть здесь: http://support.microsoft.com/kb/885146/en-us
7 авг 14, 10:58    [16410356]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
mrGuest
Guest
Glory,
Это просто тест клиента на разных пользовательских машинах.
А результат я представил, может это кому-то поможет решить проблему. Например использованием других драйверов или переписыванием запросов. Или предложенным Сон Веры Павловны способом.

Кстати так ADOQuery.LockType = ltReadOnly приведенный пример действительно работает без ошибок.
Кроме WinServer2003, но там совсем другая песня, кажется админы что-то перемудрили.
7 авг 14, 11:40    [16410661]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Glory
Member

Откуда:
Сообщений: 104751
mrGuest
Это просто тест клиента на разных пользовательских машинах.

Не машина общается с сервером, а драйвер.
Какой смысл использовать устравший драйвер, если в используете новый сервер и его новый функционал ?
7 авг 14, 11:43    [16410679]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Glory
mrGuest
Это просто тест клиента на разных пользовательских машинах.

Не машина общается с сервером, а драйвер.
Какой смысл использовать устравший драйвер, если в используете новый сервер и его новый функционал ?
Бывает, что не выпускаю драйверов для старых ОС. Например, работает какой нибуть кассовый терминал на XP Embedded...
7 авг 14, 12:21    [16410947]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexeyvg
Glory
пропущено...

Не машина общается с сервером, а драйвер.
Какой смысл использовать устравший драйвер, если в используете новый сервер и его новый функционал ?
Бывает, что не выпускаю драйверов для старых ОС. Например, работает какой нибуть кассовый терминал на XP Embedded...

Если у вас все работает без всяких новых версий и APLLY, то какой смысл в переходе на на новую версию сервера с переписываением(!) серверного кода, но без апгрейда/переписывания клиента и его драйвера ???
7 авг 14, 12:24    [16410967]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Glory
alexeyvg
пропущено...
Бывает, что не выпускаю драйверов для старых ОС. Например, работает какой нибуть кассовый терминал на XP Embedded...

Если у вас все работает без всяких новых версий и APLLY, то какой смысл в переходе на на новую версию сервера с переписываением(!) серверного кода, но без апгрейда/переписывания клиента и его драйвера ???
Это конечно, ошибка. Переход-то часто необходим, но вот использование несовместимых операторов, типов данных и т.д. недопустимо, согласен.
7 авг 14, 12:56    [16411230]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
mrGuest
Guest
О какой новой версии идет речь? И о каком переходе?

Если допустим есть некий старый проект, клиентская часть разработана с использованием MDAC, серверная часть SQL Server 2005 (это Glory для Вас новая версия?). Разработчики со стороны БД, с появлением SQL Server 2005, стали всё чаще использовать новые его возможности в частности те самые apply. После чего у многих периодически стали появляться описанные выше проблемы. Решаются ли они переходом клиентской части на SQL Native Client увы не знаю. Так же как не знаю не принесет ли этот переход других проблем. Каждый в своем случае будет принимать своё решение. Тем же кто решит попробовать стоит почитать в MSDN о различиях в драйверах и нюансах их использования.
Еще раз, я всего лишь добавил информацию о том, какие проблемы могут возникать при использовании разных версий MDAC и apply. И один из возможных способов решения. Теперь их как минимум два:
- править запросы;
- использовать LockType.
7 авг 14, 13:06    [16411321]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Glory
Member

Откуда:
Сообщений: 104751
mrGuest
Если допустим есть некий старый проект, клиентская часть разработана с использованием MDAC, серверная часть SQL Server 2005 (это Glory для Вас новая версия?).

И что там при разработке проекта уже был использован APPLY ?

mrGuest
Разработчики со стороны БД, с появлением SQL Server 2005, стали всё чаще использовать новые его возможности в частности те самые apply.После чего у многих периодически стали появляться описанные выше проблемы

Гы, "с появлением SQL Server 2005" означает, что до этого был НЕ SQL Server 2005 ? И в этом НЕ SQL Server 2005 был уже APPLY ?

Т.е. у разработчиков при разработке появлялись ошибки, но они упорно пихали этот код в продакшен ??? Круто
7 авг 14, 13:13    [16411370]     Ответить | Цитировать Сообщить модератору
 Re: Глючит OUTER APPLY  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Дык для фич 2005 и выше придуман Native драйвер, старый и новые типы данных не поддерживает.
7 авг 14, 13:41    [16411549]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить