Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Добрый день всем!
Не могу понять, почему работает этот код (это часть SP):

	...
           DECLARE @OPENQUERY nvarchar(max), @TSQL nvarchar(max), @LinkedServer nvarchar(max)
	SET @LinkedServer = @dbname
	SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
	SET @TSQL = ' 
	select pid,
           gid,
           SUM (zvalue) as Qty
	from calcrep
	WHERE calcrep.pid = ' + cast (@wc_order as nvarchar (20)) + ' 
	GROUP BY pid, gid
	'' ) ' 
	EXEC (@OPENQUERY+@TSQL)    
           ... 

и не работает соединение таблиц через JOIN или WHERE, например,
...
	DECLARE @OPENQUERY nvarchar(max), @TSQL nvarchar(max), @LinkedServer nvarchar(max)
	SET @LinkedServer = @dbname
	SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
	SET @TSQL = ' 
	select pid,
    gid,
    SUM (zvalue) as Qty
	from calcrep
	JOIN constructions ON calcrep.pid = constructions.id    
	WHERE calcrep.pid = ' + cast (@wc_order as nvarchar (20)) + ' 
	GROUP BY pid, gid
	'' ) ' 
	EXEC (@OPENQUERY+@TSQL) 
...


Результат:
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "WCOFFERS_77" reported an error. The provider did not give any information about the error.
Msg 7321, Level 16, State 2, Line 1
An error occurred while preparing the query " 
	select pid,
    gid,
    SUM (zvalue) as Qty
	from calcrep
	JOIN constructions ON calcrep.pid = constructions.id    
	WHERE calcrep.pid = 229 
	GROUP BY pid, gid
	" for execution against OLE DB provider "MSDASQL" for linked server "WCOFFERS_77". 

Этот же запрос, отправленные напрямую к FireBird (2.5) - работает 100%.

Т.е. явно есть какие-то ограничения, накладываемые на синтаксис запроса к FireBird как LinkedServer в MS SQL.
Какие именно и как правильно соеденитьтаблицы в OPENQUERY, кто-нибудь в курсе?

p.s.
select @@version

Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (X64) Aug 22 2012 19:25:47 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
27 янв 14, 16:11    [15476388]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Glory
Member

Откуда:
Сообщений: 104760
Romka-Fes
Этот же запрос, отправленные напрямую к FireBird (2.5) - работает 100%.

Через того же провайдера, что использует и ваш OPENQUERY ?
27 янв 14, 16:14    [15476420]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Glory, и "да" и "нет". "Напрямую" - через fbclient.dll в IBExpert (запостил тему в MS SQL, так как в нём таки запросы пытаюсь выполнить проблемные).
Настраивая Linked Server выбирал Microsoft OLE DB Provider for ODBC Drivers и ту же fbclient.dll. Предварительно установил драйвера для FireBird и создал источники данных ODBC.

Т.е. если под провайдером понимать fbclient.dll - то да, "Через того же провайдера, что использует и ваш OPENQUERY".
Но сама специфика подключения Linked Server'a подразумевает некоторые отличия в среде выполнения запроса (тот же Microsoft OLE DB Provider for ODBC Drivers ).

Попробую перефразировать свой вопрос: у кого-то работает JOIN в запросе к FireBird, прилинкованном через ODBC к MS SQL 2008?
27 янв 14, 16:53    [15476819]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Glory
Member

Откуда:
Сообщений: 104760
Romka-Fes
Настраивая Linked Server выбирал Microsoft OLE DB Provider for ODBC Drivers и ту же fbclient.dll

Это, извините, как можно при настройке ODBC выбрать dll ?

Romka-Fes
у кого-то работает JOIN в запросе к FireBird, прилинкованном через ODBC к MS SQL 2008?

Запрос внутри OPENQUERY никак не зависит от MS SQL.
Потому что он передается наружу.
27 янв 14, 16:58    [15476865]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Glory,

"Это, извините, как можно при настройке ODBC выбрать dll ?"

Это вот так:
Картинка с другого сайта.
27 янв 14, 17:17    [15476994]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Glory
Member

Откуда:
Сообщений: 104760
Romka-Fes
Это вот так:

А еще откуда нибудь этот ODBC работает
Например, из Excel ?
27 янв 14, 17:25    [15477070]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Glory, не держу на сервере MS Office. Поставлю, проверю.
Как минимум он работает в MS SQL Server 2008, если в запросах не использовать JOIN.
Схожу в форум FB, может есть в нём специфика работы через ODBC-Linked Server в MS SQL.
27 янв 14, 17:36    [15477174]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Glory
Member

Откуда:
Сообщений: 104760
Romka-Fes
если в запросах не использовать JOIN.

Еще раз. MSSQL не выполняет текст запроса OPENQUERY
27 янв 14, 17:40    [15477214]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Glory,
Я не утверждал обратного. Я прекрасно понимаю что MS SQL сервер шлёт запрос на FB и отдаёт то, что он получает от него.
Говоря "работает в MS SQL сервер" я имею в виду то что я её (SP, фрагмент которой я приводил выше) запускаю в MS SQl Server Management studio, подключённой к MS SQl Server и получаю в результате набор данных из FB.
Я в лёгком недоумении, почему таки не работает JOIN или WHERE(для связки таблиц по ключевым полям).
27 янв 14, 17:46    [15477253]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Glory
Member

Откуда:
Сообщений: 104760
Romka-Fes
Я в лёгком недоумении, почему таки не работает JOIN или WHERE(для связки таблиц по ключевым полям).

An error occurred while preparing the query - драйверу или линкед серверу не нарвится текст вашего запроса. Надо выяснять(мониторить), какой собственно текст запроса приходит в Firebird
27 янв 14, 17:52    [15477284]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10647
Romka-Fes,

нафига в конце кавычка указана?

автор
'' ) '
вот эта ''
27 янв 14, 18:01    [15477371]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Glory
Member

Откуда:
Сообщений: 104760
Симонов Денис
нафига в конце кавычка указана?

автор
'' ) '
вот эта ''

Это требование TSQL к экранированию вложенных кавычек
Запрос, который выполняется выглядит так
SELECT * FROM OPENQUERY(MYLinkedServer,' 
	select pid,
    gid,
    SUM (zvalue) as Qty
	from calcrep
	JOIN constructions ON calcrep.pid = constructions.id    
	WHERE calcrep.pid = 1 
	GROUP BY pid, gid
	' ) 
27 янв 14, 18:06    [15477410]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10647
а если всем полям явно приписать к каким они таблицам относятся
27 янв 14, 18:07    [15477424]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Симонов Денис
Romka-Fes,

нафига в конце кавычка указана?

автор
'' ) '
вот эта ''


Чтобы не было ошибки
Msg 105, Level 15, State 1, Procedure wc_proc_tblCalcRep, Line 30
Unclosed quotation mark after the character string '

которая появляется, если кавычку убрать.
Я же формирую строку динамического SQL, которую пердаю затем EXEC'у.
И эта кавычка закрывает открывающую:
SET @TSQL = '
27 янв 14, 18:08    [15477429]     Ответить | Цитировать Сообщить модератору
 Re: JOIN в OPENQUERY в FireBird, 2.5 который LinkedServer  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 456
Симонов Денис
а если всем полям явно приписать к каким они таблицам относятся

Заработало!
Thanks a lot.
27 янв 14, 18:11    [15477443]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить