Вложени преходни заявки?

Имам 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 като обикновена заявка за Access, която извиква abc, но това ще намали производителността, тъй като заявката сега се обработва от ACE вместо от SQL Server.

Има ли някакъв начин за влагане на съхранени преходни заявки в Access? Или създаването на съхранени процедури в SQL Server е единственият начин да се постигне това?


person sigil    schedule 06.12.2013    source източник


Отговори (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 ще го изтрие автоматично вместо вас, когато връзката ви с SQL Server се затвори.

person Gord Thompson    schedule 06.12.2013