Не работает фильтр Like

Добрый день!

Не работает фильтр Like:

в коде

                        var LikeName = new String('Группа МС');
                        ApplyDatasetFilter(LookupDataset, 'LikeName', LikeName, true);

в sq-запросе фильтр и параметр называются LikeName

в профайлере запрос к базе выглядит так:

exec sp_executesql N'SELECT TOP 40
        [tbl_Contact].[ID] AS [ID],
        [tbl_Contact].[Name] AS [Name],
        [tbl_Account].[Name] AS [AccountName]
FROM
        [dbo].[tbl_Contact] AS [tbl_Contact]
INNER JOIN
        [dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[UserContactID] = [tbl_Contact].[ID]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Contact].[AccountID]
WHERE(EXISTS
        (SELECT
                [tbl_ContactDirect].[ID] AS [ID]
        FROM
                [dbo].[tbl_ContactDirect] AS [tbl_ContactDirect]
        WHERE([tbl_Contact].[ID] = [tbl_ContactDirect].[ContactID] AND
                [tbl_ContactDirect].[DirectID] = @P1 AND
                [tbl_ContactDirect].[IsInOpportunity] = @P2)) AND
        EXISTS
        (SELECT
                [tbl_ContactDepartment].[ID] AS [ID]
        FROM
                [dbo].[tbl_ContactDepartment] AS [tbl_ContactDepartment]
        WHERE([tbl_Contact].[ID] = [tbl_ContactDepartment].[ContactID] AND
                [tbl_ContactDepartment].[DepartmentID] = @P3)) AND
        [tbl_Contact].[Name] LIKE '
'%'' + NULL + ''%'')',N'@P1 nvarchar(38),@P2 int,@P3 nvarchar(38)',N'{4BEFFD29-FF07-4C4A-BF6D-FF9139F11D5D}',1,N'{8757E935-B255-406B-B096-00DD8D52B019}'

[tbl_Contact].[Name] LIKE ''%'' + NULL + ''%'') - почему-то не воспринимает параметр.

Нравится

11 комментариев

А в sq в вас есть параметр, и в Like фильтре все хорошо? Добавьте скриншот sq c этим фильтром

вот фильтр.

Параметр существует.

Судя по запросу в профайлере, туда передается пустое значение. желательно произвести отладку, и проверить состояние параметра на момент открытия датасета.

При фильтрации датасета параметр имеет нужное значение.

А при открытии (этот момент отображается в профайлере) как раз пустое.

Лена, все просто, название параметра должно совпадать с названием фильтра, если посмотрите на функцию ApplyDatasetFilter поймете почему

Если бы были разные имена, то вываливалась бы ошибка.

Я не из того запроса скопировала фильтр.
На всякий случай переименовала, но ошибка та же

		var LikeName1 = new String('Группа МС');
		ApplyDatasetFilter(LookupDataset, 'LikeName1', LikeName1, true);
exec sp_executesql N'SELECT TOP 40
	[tbl_Contact].[ID] AS [ID],
	[tbl_Contact].[Name] AS [Name],
	[tbl_Account].[Name] AS [AccountName]
FROM
	[dbo].[tbl_Contact] AS [tbl_Contact]
INNER JOIN
	[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[UserContactID] = [tbl_Contact].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Contact].[AccountID]
WHERE(EXISTS 
	(SELECT
		[tbl_ContactDirect].[ID] AS [ID]
	FROM
		[dbo].[tbl_ContactDirect] AS [tbl_ContactDirect]
	WHERE([tbl_Contact].[ID] = [tbl_ContactDirect].[ContactID] AND
		[tbl_ContactDirect].[DirectID] = @P1 AND
		[tbl_ContactDirect].[IsInOpportunity] = @P2)) AND
	EXISTS 
	(SELECT
		[tbl_ContactDepartment].[ID] AS [ID]
	FROM
		[dbo].[tbl_ContactDepartment] AS [tbl_ContactDepartment]
	WHERE([tbl_Contact].[ID] = [tbl_ContactDepartment].[ContactID] AND
		[tbl_ContactDepartment].[DepartmentID] = @P3)) AND
	[tbl_Contact].[Name] LIKE ''%'' + NULL + ''%'')',N'@P1 nvarchar(38),@P2 int,@P3 nvarchar(38)',N'{4BEFFD29-FF07-4C4A-BF6D-FF9139F11D5D}',1,N'{8757E935-B255-406B-B096-00DD8D52B019}'

Попробуйте написать просто var LikeName1 = 'Группа МС';

То же самое.
И если написать ApplyDatasetFilter(LookupDataset, 'LikeName1', 'Группа МС%', true);
та же ошибка

Последняя догадка, перед тем как нужно отлаживаться: Попробуйте назвать параметр и фильтр Name - как поле таблицы.
Если не поможет, ставьте debugger (Ctrl+F5) заходите в функцию ApplyDatasetFilter, и смотрите что там происходит.
Про инструменты для отладки можете почитать тут

Спасибо за совет, но именно в ходе отладки я выяснила, что параметр передается и всё ок в функции ApplyDatasetFilter.

Мне не очень нравится ваш подзапрос

(SELECT
                [tbl_ContactDepartment].[ID] AS [ID]
        FROM
                [dbo].[tbl_ContactDepartment] AS [tbl_ContactDepartment]
        WHERE([tbl_Contact].[ID] = [tbl_ContactDepartment].[ContactID] AND
                [tbl_ContactDepartment].[DepartmentID] = @P3)) AND
        [tbl_Contact].[Name] LIKE ''%'' + NULL + ''%'')

Попробуйте тут написать в духе
SELECT * from [dbo].[tbl_ContactDepartment], [tbl_Contact] as [tbl_Contact1]
where [tbl_Contact1].ID and [tbl_ContactDepartment].[ContactID] and ... and [tbl_Contact1].[Name] like ...
Я к тому что у него слишком большая степень вложенности, возможно из-за этого баг

Показать все комментарии