2013-12-06 7 views
0

У меня есть ODBC-соединение с базой данных SQL Server, и поскольку я возвращаю большие наборы записей с моими запросами, я обнаружил, что быстрее запускать сквозные запросы, чем собственные запросы Access.Вложенные сквозные запросы?

Но мне сложно писать и упорядочивать мои запросы, поскольку, насколько я знаю, я не могу сохранить несколько разных сквозных запросов и присоединиться к ним в другом сквозном запросе. У меня есть доступ только для чтения к этой базе данных, поэтому я не могу сохранять хранимые процедуры в SQL Server, а затем ссылаться на них в прохождении.

Например, предположим, что я хочу, чтобы получить только те записи с максимальным значением o_version из следующего запроса:

select d.o_filename,d.o_version,parent.o_projectname 
from dms_doc d 
left join 
dms_proj p 
on 
d.o_projectno=p.o_projectno 
left join 
dms_proj parent 
on 
p.o_parentno=parent.o_projectno 
where 
p.o_projectname='ABC' 
and 
lower(left(right(d.o_filename,4),3))='xls' 
and 
charindex('xyz',lower(d.o_filename))=0 

Я хочу, чтобы получить только те записи с максимальным значением d.o_version. Обычно я хотел бы сохранить это как запрос называется, например, abc, а затем написать еще один запрос abcMax:

select * from abc 
inner join 
(select o_filename,o_projectname,max(o_version) as maxVersion from abc 
group by o_filename,o_projectname) abc2 
on 
abc.o_filename=abc2.o_filename 
and 
abc.o_projectname=abc2.o_projectname 
where 
abc.o_version=abc2.maxVersion 

Но если я не могу хранить abc как запрос, который может быть использован в проходном запроса abcMax , то не только мне нужно копировать весь объект abc в abcMax несколько раз, но если я внесем какие-либо изменения в содержание abc, тогда мне нужно сделать их для каждой копии, встроенной в abcMax.

Альтернативой является запись abcMax в качестве обычного запроса доступа, который вызывает abc, но это снизит производительность, поскольку запрос теперь обрабатывается ACE вместо SQL Server.

Есть ли способ вставить хранимые сквозные запросы в Access? Или создает хранимые процедуры на SQL Server только для этого?

ответ

1

Если у вас есть (или может получить) разрешение на создание временных таблиц на SQL Server, вы можете использовать их в некоторых целях. Например, вы можете запустить один сквозной запрос, чтобы создать временную таблицу с результатами первого запроса (значительно упрощен, в данном примере):

CREATE TABLE #abc (o_filename NVARCHAR(50), o_version INT, o_projectname NVARCHAR(50)); 
INSERT INTO #abc SELECT o_filename, o_version, o_projectname FROM dms_doc; 

, а затем ваш второй сквозной запрос может просто ссылаться временная таблица

select * from #abc 
inner join 
(select o_filename,o_projectname,max(o_version) as maxVersion from #abc 
group by o_filename,o_projectname) abc2 
on 
#abc.o_filename=abc2.o_filename 
and 
#abc.o_projectname=abc2.o_projectname 
where 
#abc.o_version=abc2.maxVersion 

Когда вы закончите вы можете запустить сквозной запрос явно удалить временную таблицу

DROP TABLE #abc 

или SQL Server будет удалять I t для вас автоматически, когда ваше соединение с SQL Server закрывается.

Смежные вопросы