Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не работает частичное сравнение в теле UDF / 14 сообщений из 14, страница 1 из 1
23.06.2019, 20:05
    #39829637
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
Здравствуйте !

Есть функция. Вот ее фрагмент:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
-- Курсор получен и наполнен отсортированными записями списка абонентов
   -- начало цикла перебора записей
   SET @nr = 0
   OPEN @TB
   FETCH NEXT FROM @TB INTO @TB_ID, @TB_Number, @ABONS_FIO, @ABONS_ADR, @ABONS_NOFIX, @REG_Name, @TO_Name, @POS_NAME
   WHILE (@@FETCH_STATUS = 0) 
      BEGIN 
        SET @nr = @nr + 1 -- счетчик записей общий
        FETCH NEXT FROM @TB INTO @TB_ID, @TB_Number, @ABONS_FIO, @ABONS_ADR, @ABONS_NOFIX, @REG_Name, @TO_Name, @POS_NAME
		IF @SearchColumn = 'TB_Number'
		   BEGIN
		     IF @SearchFlag = 1
			    IF @TB_Number = @SearchSample 
				  BEGIN
				    SET @Nrow = @nr
					SET @TbID = @TB_ID
					BREAK
                  END
             ELSE
             IF CHARINDEX(@SearchSample, @TB_Number) > 0
--             IF @TB_Number Like '%'+@SearchSample+'%' 
				  BEGIN
				    SET @Nrow = @nr
					SET @TbID = @TB_ID
					BREAK
                  END
		   END


При точном сравнении (@SearchFlag = 1) все работает как часики
А вот если задать частичное сравнение, то ни LIKE, ни CHARINDEX не "пашут". Результат всегда false, хотя при заданных параметрах (тех самых, что возвращают Ok если задан @SearchFlag = 1), запись найтись обязана

В чем косяк ?

Спасибо за ответы
...
Рейтинг: 0 / 0
23.06.2019, 20:44
    #39829644
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
MsGuns,

Условия как-то не одинаковы для переменной
IF @SearchColumn = 'TB_Number'
...
Рейтинг: 0 / 0
23.06.2019, 21:01
    #39829645
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
TaPaK,"TB_Number" - имя колонки View. Функция используется для поиска в этом вью. Задается образец и имя столбца, где искать
...
Рейтинг: 0 / 0
23.06.2019, 21:36
    #39829649
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
MsGunsЗадается образец и имя столбца, где искатьMsGuns
Код: sql
1.
2.
             IF CHARINDEX(@SearchSample, @TB_Number) > 0
--             IF @TB_Number Like '%'+@SearchSample+'%' 


Это, типа, поиск в колонке, наименование которой задано @TB_Number?
...
Рейтинг: 0 / 0
23.06.2019, 22:07
    #39829650
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
invm,
@SearchSample - параметр функции, в котором ей передается образец для поиска (строка)
@TB_Number - имя локальной переменной, в которое FETCH запишет содержимое поля TB_Number очередной строки НД

Данная фраза означает: найти вхождение подстроки, заданной @SearchSample, в строку, записанную FETCH NEXT из поля датасета TB_Number в локальную переменную @TB_Number

Тут все верно, иначе не работала бы первая часть логики (там, где @SearchFlag = 1), а она-то как раз и работает !

Имя колонки, где искать, задается в параметре @SearchColumn
...
Рейтинг: 0 / 0
23.06.2019, 22:53
    #39829654
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
MsGunsВ чем косяк ?У вас ELSE к чему относится, к IF @TB_Number = @SearchSample ?
Не жалейте BEGIN ... END
...
Рейтинг: 0 / 0
24.06.2019, 13:13
    #39829798
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
alexeyvgMsGunsВ чем косяк ?У вас ELSE к чему относится, к IF @TB_Number = @SearchSample ?
Не жалейте BEGIN ... END

Огромное спасибо. После того, как добавил BEGIN .. END заработали все 3 варианта.

Тема закрыта
...
Рейтинг: 0 / 0
24.06.2019, 13:24
    #39829804
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
MsGuns,

А вы не пытались решить вашу задачу без курсоров?
...
Рейтинг: 0 / 0
24.06.2019, 13:46
    #39829834
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
a_voroninMsGuns,
А вы не пытались решить вашу задачу без курсоров?
А зачем ему решать эту задачу, если задача стоит решить задачу.
За думать программистам, пишущим на курсорах, не доплачивают.
...
Рейтинг: 0 / 0
24.06.2019, 13:50
    #39829838
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
a_voroninMsGuns,

А вы не пытались решить вашу задачу без курсоров?

Суть проблемы в том, что на странице (ASP.NET NVC) отображается только один лист из списка, выбранного по некоторым критериям (в данном случае - территориальным) и отсортированного по колонке, указанной пользователем. На странице имеется навигация по листам (вперед, назад, перейти к листу). То есть имеется некий "формат" общего списка, отображаемого на клиенте в определенном порядке.

Поиск записи нужен в двух случаях:
1) при добавлении нового абонента пользователь должен увидеть страницу, где новый абонент будет виден, а для этого нужен поиск по ID (для этого есть UDF, подобная этой, но там поиск по ID и все много проще.
2) Для реализации функции поиска по любой из колонок (именно эта UDF).

После нахождения записи списка (абонента) на клиенте должна отобразиться соотв.страница.

Постраничная "резка" выбранного и отсортированного списка выполняется на SQL-сервере ХП, но в эту ХП нужно "дать" номер листа. Вот его-то и определяет приведенная здесь UDF. Которая сначала выбирает весь список, сортирует его, затем ищет искомое, "перебирая" листы. Когда лист найден, он передается ХП (в одном из методов модели MVC) и полученный лист передается Razor, который "собирает" из записей страницу и отправляет ее на клиент браузеру.
...
Рейтинг: 0 / 0
24.06.2019, 13:54
    #39829846
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
Руслан Дамировичa_voroninMsGuns,
А вы не пытались решить вашу задачу без курсоров?
А зачем ему решать эту задачу, если задача стоит решить задачу.
За думать программистам, пишущим на курсорах, не доплачивают.

Ваше замечание в данном случае совершенно не к месту. Мне никто не платит и не "доплачивает". Алгоритмы выдумываю сам и реализую тоже сам. А что они не оптимальны, в этом у меня нет сомнений в большинстве случаев. Если можно решить описанную выше задачу без курсора, буду весьма обязан, если кто-то выскажет подходящие соображения.
...
Рейтинг: 0 / 0
24.06.2019, 13:57
    #39829848
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
MsGunsa_voroninMsGuns,

А вы не пытались решить вашу задачу без курсоров?

Суть проблемы в том, что на странице (ASP.NET NVC) отображается только один лист из списка, выбранного по некоторым критериям (в данном случае - территориальным) и отсортированного по колонке, указанной пользователем. На странице имеется навигация по листам (вперед, назад, перейти к листу). То есть имеется некий "формат" общего списка, отображаемого на клиенте в определенном порядке.

Поиск записи нужен в двух случаях:
1) при добавлении нового абонента пользователь должен увидеть страницу, где новый абонент будет виден, а для этого нужен поиск по ID (для этого есть UDF, подобная этой, но там поиск по ID и все много проще.
2) Для реализации функции поиска по любой из колонок (именно эта UDF).

После нахождения записи списка (абонента) на клиенте должна отобразиться соотв.страница.

Постраничная "резка" выбранного и отсортированного списка выполняется на SQL-сервере ХП, но в эту ХП нужно "дать" номер листа. Вот его-то и определяет приведенная здесь UDF. Которая сначала выбирает весь список, сортирует его, затем ищет искомое, "перебирая" листы. Когда лист найден, он передается ХП (в одном из методов модели MVC) и полученный лист передается Razor, который "собирает" из записей страницу и отправляет ее на клиент браузеру.

Поправка: вместо "Когда лист найден, он передается ХП" следует читать "Когда лист найден, его номер передается ХП"
...
Рейтинг: 0 / 0
24.06.2019, 14:03
    #39829855
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
Я отдаю себе отчет, что при поиске (по ID и по "маске") сервер ДВАЖДЫ делает одну и ту работу, выбирая нужные записи в нужном порядке, но "фишка" в том, что функционал поиска добавлен позднее, а менять модель MVC штука не тривиальная. Поэтому к уже имеющейся "постройке" был добавлен новый "флигелек" :) А сервер - он на то и сервер, чтобы работать (шутка, конечно, но в каждой шутке..)
...
Рейтинг: 0 / 0
24.06.2019, 14:08
    #39829860
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает частичное сравнение в теле UDF
Если что, вот сама хранимка:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
-- =======================================================================================================
--  Процедура выбирает из списка абонентов записи по указанному вх.параметру RegionName или праметру TOName 
--  или все записи, если не указан ни тот, ни другой. 
--  Записи сортируются по колонке, указанной параметром colname,
--  Из отсортированного набота записей выбираются те, которые относятся к листу,
--  указанному параметром NList. Максимальное кол-во строк на листе определяется параметром QRows
-- =======================================================================================================
ALTER PROCEDURE [dbo].[UsSP_FetchTelBookByRegOrTO_List]
	@RegionName nvarchar(max),
	@TOName nvarchar(max),
    @colname sysname,   -- Наименование колонки для сортировки
	@Nlist int,         -- № листа
	@Qrows int          -- Количество строк на листе максимальное 

AS
BEGIN
	SET NOCOUNT ON;
    IF @RegionName > '' -- Указан регион
	   BEGIN
	    -- Извлечь записи по региону, отсортировать по колонке 
     	SELECT * FROM UsV_FullTelBook
		   WHERE REG_Name = @RegionName
           ORDER BY CASE
              WHEN @colname = 'TB_Number' THEN TB_Number
              WHEN @colname = 'ABONS_FIO' THEN ABONS_FIO
              WHEN @colname = 'ABONS_ADR' THEN ABONS_ADR
              WHEN @colname = 'ABONS_NOFIX' THEN ABONS_NOFIX
              WHEN @colname = 'REG_Name' THEN REG_Name
              WHEN @colname = 'TO_Name' THEN TO_Name
              WHEN @colname = 'POS_Name' THEN POS_NAME
              ELSE ABONS_FIO
          END
 		  -- вырезать указанный лист
          offset (@Nlist-1)*@Qrows rows fetch next @Qrows rows only
       END
    ELSE
       IF @TOName > '' -- Указано управление
	      BEGIN
     	   SELECT * FROM UsV_FullTelBook
    		   WHERE TO_Name = @TOName
               ORDER BY CASE
                  WHEN @colname = 'TB_Number' THEN TB_Number
                  WHEN @colname = 'ABONS_FIO' THEN ABONS_FIO
                  WHEN @colname = 'ABONS_ADR' THEN ABONS_ADR
                  WHEN @colname = 'ABONS_NOFIX' THEN ABONS_NOFIX
                  WHEN @colname = 'REG_Name' THEN REG_Name
                  WHEN @colname = 'TO_Name' THEN TO_Name
                  WHEN @colname = 'POS_Name' THEN POS_NAME
                  ELSE ABONS_FIO
               END
 		  -- вырезать указанный лист
          offset (@Nlist-1)*@Qrows rows fetch next @Qrows rows only
		  END
	   ELSE      -- Не указан ни регион, ни управление
	      BEGIN
     	   SELECT * FROM UsV_FullTelBook
               ORDER BY CASE
                  WHEN @colname = 'TB_Number' THEN TB_Number
                  WHEN @colname = 'ABONS_FIO' THEN ABONS_FIO
                  WHEN @colname = 'ABONS_ADR' THEN ABONS_ADR
                  WHEN @colname = 'ABONS_NOFIX' THEN ABONS_NOFIX
                  WHEN @colname = 'REG_Name' THEN REG_Name
                  WHEN @colname = 'TO_Name' THEN TO_Name
                  WHEN @colname = 'POS_Name' THEN POS_NAME
                  ELSE ABONS_FIO
               END
 		  -- вырезать указанный лист
          offset (@Nlist-1)*@Qrows rows fetch next @Qrows rows only
          END
END
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не работает частичное сравнение в теле UDF / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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