powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Фильтры с мультиселектом. Как лучше реализовывать?
16 сообщений из 16, страница 1 из 1
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219166
Фотография начинающий sql-гуру
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На вход в процедуру поступает множество параметров для фильтрации с мультивыбором.
Это строки nvarchar(max), в которых через разделитель (запятую) перечислены GUIDы или int.
Например, набор типов, статусов, объектов, по которым надо отфильтровать результирующий набор.

Строчка разворачивается в столбец и "иннерджойнится" с той таблицей, которая подлежит фильтрации.

Наприммер, так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
		--------------- фильтр по конкретным субкорпусам с мультивыбором
		INNER JOIN
	    (
			SELECT CAST(Field as uniqueidentifier)  as Field 
			FROM [dbo].[pik_fn_GetTableFromParam](NULLIF(@new_bulk_multi, ''), ',')
		) bk
		on bk.Field = be.new_bulkId or @new_bulk_multi = ''



Варианты реализации функции pik_fn_GetTableFromParam, которая реализует разворачивает строку в столбец были испробованы разные, вплоть до встраивания запроса вовнутрь, без использования функции.

Но такой фильтр в любом случае заметно тормозит работу.
Чем больше значений в нём указано (через запятую), тем медленнее будет работать запрос.

Если таких фильтров задано много, то беда-беда!

Может есть более прогрессивные подходы решению к этой стандартной часто возникающей задачи?
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219175
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинающий sql-гуру,

на вход процедуры можно сразу передать параметр табличного типа.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219178
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинающий sql-гуруЭто строки nvarchar(max), в которых через разделитель (запятую) перечислены GUIDы или int.
И что формирует эти строки ?
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219181
Фотография начинающий sql-гуру
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillначинающий sql-гуру,

на вход процедуры можно сразу передать параметр табличного типа.
Это с клиентчиками ещё перетереть надо.
Насколько им трудоёмко будет перепилить это со своей стороны.
Но, наверное, профит того стоит.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219200
Фотография начинающий sql-гуру
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gloryначинающий sql-гуруЭто строки nvarchar(max), в которых через разделитель (запятую) перечислены GUIDы или int.
И что формирует эти строки ?
Клиентское приложение.
В нём пользователь делает либо мультиселект в гриде, либо ставит несколько галочек в выпадающем списке.
Процедура вызывается с перечислением в строчку id выбранных пунктов.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219206
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинающий sql-гуруКлиентское приложение.
В нём пользователь делает либо мультиселект в гриде, либо ставит несколько галочек в выпадающем списке.
Почему бы клиентскому приложению не формировать на сервере таблицу вместо строк ?
Которые все равно парсятся в таблицу
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219216
trew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillначинающий sql-гуру,

на вход процедуры можно сразу передать параметр табличного типа.
У меня это реализовано так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
-- входящий параметр
@city           varchar(MAX) = NULL --'<roots><fc><city>Москва</city></fc><fc><city>Самара</city></fc></roots>'

-- в коде
SELECT @xml = CONVERT(xml, @city)   
         
    CREATE TABLE #city  -- получение списка городов
    (
        city varchar(30) NULL
    )    
    INSERT INTO #city (city)
    SELECT 
        col.value('city[1]', 'varchar(30)')
    FROM @xml.nodes('roots/fc') AS FilterCity(col)  

...
WHERE city IN (SELECT city FROM #city) 
  


Или лучше всё же пользоваться параметрами табличного типа ? (ms sql 2012)
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219237
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trew,

смотрите сами. по быстродействию, удобству и т.д.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219245
Фотография начинающий sql-гуру
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gloryначинающий sql-гуруКлиентское приложение.
В нём пользователь делает либо мультиселект в гриде, либо ставит несколько галочек в выпадающем списке.
Почему бы клиентскому приложению не формировать на сервере таблицу вместо строк ?
Которые все равно парсятся в таблицу
Это как?
Перед запуском основной процедуры выполнить из клиентского кода запрос на создание нескольких таблиц, содержащих фильтры?
Причём с (пере)созданием отдельной таблицы для каждого пользователя, либо с записью информации опользователе и с текущей датой+временем воизбежание получения некорректных фильтров?

Или я что-то не так понимаю?
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219250
Фотография начинающий sql-гуру
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakilltrew,
смотрите сами. по быстродействию, удобству и т.д.
Ну, если в 3,5 .NET-е есть способ приведения коллекций или DataTable к SQL-евскому типу табличной переменной, то это было бы здорово.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219261
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинающий sql-гуруЭто как?
Перед запуском основной процедуры выполнить из клиентского кода запрос на создание нескольких таблиц, содержащих фильтры?
Хотя бы так
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219619
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gloryначинающий sql-гуруЭто как?
Перед запуском основной процедуры выполнить из клиентского кода запрос на создание нескольких таблиц, содержащих фильтры?
Хотя бы так

таблицы-то наверное создавать не нужно, они будут предопределённые,
а приложение в них будет напихивать строчки с идентификатором своей сессии и значениями параметра.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38219993
Фотография начинающий sql-гуру
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выяснил, что в последнем .NET-е есть
SqlDbType.Structured - это как раз под передачу таблиц-переменных в процедуры (TVP).

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

Так что однофигственно, походу, что передавать: строку, xml или TVP.((
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38220009
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинающий sql-гуру,

но в табличной переменной можно сделать индексы.
Глядишь, полегчает.
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38220011
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapначинающий sql-гуру,

но в табличной переменной можно сделать индексы.
Глядишь, полегчает.Хотя, при небольшом количестве записей ненамного
...
Рейтинг: 0 / 0
Фильтры с мультиселектом. Как лучше реализовывать?
    #38220028
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинающий sql-гуруТак что однофигственно, походу, что передавать: строку, xml или TVP.((Да, по быстродействию неважно.
Смотрите на удобство программирования, отладки, поддержки, защиты от взлома...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Фильтры с мультиселектом. Как лучше реализовывать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]