SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Microsoft SQL Server » Запрос + представление или функция, как лучше сделать?* (Задача со звездочкой) (Нужен совет сообщества.)
Запрос + представление или функция, как лучше сделать?* (Задача со звездочкой) [сообщение #2927] Mon, 07 August 2023 10:28 Переход к предыдущему сообщению
Sanek в настоящее время не в онлайне  Sanek
Сообщений: 8
Зарегистрирован: August 2023
Junior Member
Наткнулся на следующую проблему ...
Дано:
Есть представление, которое очень сложным образом раcсчитывает галочку "можно, нельзя" для каждого объекта.
Есть CTE запрос, который поделен на блоки вроде 1й блок - найти все нужные объекты, 2й - расчитать можно или нет их показывать (обращаясь к представлению) и 3й - вывод.

Что не работает:
представление считает разрешения для всей базы, но на текущий момент появилось такое кол-во записей о правах, что представление тупо зависает, пытаясь это дело обработать.

Моё решение
Появилась мысль из представления сделать функцию и передать в нее параметры , ограничивающие кол-во обрабатываемых записей, тогда функция будет работать. Но проблема в том, что список объектов, для которых надо рассчитать доступ появляется только в 1м блоке запроса.
По этой причине мне как-то надо засунуть результат запроса в параметр функции и все это в CTE )))

Вопроса два:
1. Возможно ли это реализовать (и как)
2. Может есть другой путь?

Пример кода:

Представление (естественно пример для понимания)

Create view Accesses as 
Select ObjectId from AccessTable where Allow=1

Запрос:

With SearchQuery AS (
Select ObjectId from Table1 where ...
) , SearchQueryExt (
Select * from SearchQuery 
union Select ObjectId from Table2 where .... 
union Select ObjectId from Table3 where ....
), FilterQuery (
Select * 
   fom SearchQueryExt s 
  join Accesses a on a.ObjectId = s.ObjectId
)
Select * 
  from TableN s
  join FilterQuery f on s.ObjectId = f.ObjectId

Я же хочу сделать функцию что бы было так:

Create function Accesses (ObjctIds ????)
Select ObjectId 
  from AccessTable 
 where ObjetId in ObjctIds 
   and Allow=1

А FilterQuery  поменять на что-то вроде :

.
.
.
), FilterQuery (
Select * 
   fom SearchQueryExt s 
  join dbo.fAccesses(select ObjectId from SearchQuery) on a.ObjectId = s.ObjectId
)
.
.
.

Есть мысли, как это реализовать ?
 
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Сообщение не прочитано
Предыдущая тема: Сложный поиск соответствия.
Следующая тема: Группа доступности Always ON MS SQL
Переход к форуму:
  


Текущее время: Thu May 09 12:09:54 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00779 секунд