Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Есть два поля NUMBER и SNUMBER. Оба поля типа varchar. В первое поле заносятся данные так как хочет пользователь (например: "Ab 12--1-44-G"), второе поле предполагается использовать для поиска, туда заносятся данные вычесленные из первого поля в верхнем регистре и только цыфры и буквы (пример: "AB12144G").
Как реализовать подобную конструкцию?
9 авг 11, 01:37    [11088909]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Super_DJ, если набор "мусорных" символов заранее неизвестен, то видимо формировать строку для поиска на клиенте или в триггерах. Если же набор символов знаете, то можно вычисляемое поле с реплейсами и индексом по нему.
9 авг 11, 01:47    [11088922]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
kDnZP,

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

Сам подумывал о функции которую использовать как для заполнения поля так и для последующего апдейта (если человек станет писать тоже самое с другим набором "мусора", апдейтить существующую строку поле NUMBER). Тобишь функция, тригер, процедура заполнения данных, но не соображу как это сделать.
9 авг 11, 01:59    [11088930]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Super_DJ
Тобишь функция, тригер, процедура заполнения данных, но не соображу как это сделать.
Реализовать чем угодно, от вычисляемого поля, до процедуры. Как сделать? Выбрать что-то и написать ручками.
9 авг 11, 02:09    [11088936]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Гавриленко Сергей Алексеевич,

Может я нечетко выразился, то что способов масса я понимаю, сейчас интересует само запонение поля. Тоесть заполняю поле с мусором, второе пишется автоматом.
Полагаю оптимальным будет начать с функции которая уберет "весь мусор", с ней помощи и прошу.
9 авг 11, 02:28    [11088944]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Super_DJ, начинать надо с поиска по форуму
9 авг 11, 02:59    [11088960]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
kDnZP,

Спасибо за ссылку. По ней куча громоздких но рабочих скриптов. Как и писал iap, проще перечислить все что не нужно. Нашел на другом ресурсе пример:

DECLARE @src AS NVARCHAR(4000)

SET @src = '(007) 123-456-7'

--------------------------------

DECLARE @badSymbols AS NVARCHAR(255)
DECLARE @currSymbol AS NCHAR(1)
DECLARE @pos AS INT
DECLARE @res AS NVARCHAR(4000)

SET @badSymbols = N' .,-:;''"/\?!@#$%^&*()№<>' -- список 'запрещённых' символов
SET @pos = 1
SET @res = @src

WHILE @pos <= LEN(@badSymbols)
BEGIN
    SET @res = REPLACE(@res, SUBSTRING(@badSymbols, @pos,1), '')
    SET @pos = @pos + 1    
END

-------------------------------

SELECT @src AS src, @res AS res
Теперь буду думать как это прикрутить это.
9 авг 11, 04:02    [11088984]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
aleks2
Guest
-- если у тя нет таблицы - сделай ее. 
-- Нет смысла экономить на таблицах в SQL.

--------------------------------
-- естественно @badSymbols должна быть ПОСТОЯННОЙ таблицей. Тут времянка тока для примеру.
DECLARE @badSymbols table(c NCHAR(1) primary key clustered)

insert @badSymbols 
select N' '
union all
select N'.'
union all
select N','
union all
select N'-'
union all
select N':'
union all
select N';'
union all
select N''''
union all
select N'"'
union all
select N'/'
union all
select N'\'
union all
select N'('
union all
select N')'
--?!@#$%^&*()№<>' -- список 'запрещённых' символов

DECLARE @src AS NVARCHAR(4000)
DECLARE @res AS NVARCHAR(4000)

SET @src = '(007) 123-456-7'
set @res=@src

select @res = REPLACE(@res, c, '') FROM @badSymbols

SELECT @src AS src, @res AS res
9 авг 11, 07:12    [11089065]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Если из этого добра можно собрать функцию, что бы потом использовать её как LTRIM к примеру, подсобите как это сделать.
9 авг 11, 13:34    [11091153]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Я извиняюсь...
А на клиенте это нельзя сделать?...
По моему это там надо делать и отсылать на поиск серверу уже подготовленную строку...
9 авг 11, 13:48    [11091260]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Оставить только цифры и буквы:
SET NOCOUNT ON;
DECLARE @T TABLE(ID INT NOT NULL IDENTITY, NUMBER NVARCHAR(4000));
INSERT @T(NUMBER) VALUES(N'(007) 123-456-7');

SELECT T.ID,
STUFF
(
 (
  SELECT SUBSTRING(TT.NUMBER,V.number,1)
  FROM @T TT JOIN master.dbo.spt_values V ON V.type='P' AND V.number BETWEEN 1 AND LEN(T.NUMBER)
  WHERE TT.ID=T.ID AND SUBSTRING(TT.NUMBER,V.number,1) LIKE N'[0123456789аАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ]'
  ORDER BY V.number
  FOR XML PATH(''), TYPE
 ).value('text()[1]','NVARCHAR(4000)'),
 1,1,N''
) SNUMBER
FROM @T T
ORDER BY T.ID;
Заменить все разделители:
SET NOCOUNT ON;

DECLARE @Delimiters NVARCHAR(100)='- ?!@#$%^&*()№<>';
DECLARE @T TABLE(ID INT NOT NULL IDENTITY, NUMBER NVARCHAR(4000));
INSERT @T(NUMBER) VALUES(N'(007) 123-456-7');

SELECT T.ID,
STUFF
(
 (
  SELECT SUBSTRING(TT.NUMBER,V.number,1)
  FROM @T TT JOIN master.dbo.spt_values V ON V.type='P' AND V.number BETWEEN 1 AND LEN(T.NUMBER)
  WHERE TT.ID=T.ID AND CHARINDEX(SUBSTRING(TT.NUMBER,V.number,1),@Delimiters)=0
  ORDER BY V.number
  FOR XML PATH(''), TYPE
 ).value('text()[1]','NVARCHAR(4000)'),
 1,1,N''
) SNUMBER
FROM @T T
ORDER BY T.ID;
9 авг 11, 14:54    [11091859]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Владимир СА,

Нет, пока формировать на клиенте не получится.

А вот, и iap подтянулся. Не составит ли труда помочь в создании вышеозначенной функции и тригера на поле. Или ткните где это разжевано(занимаюсь подобным не часто, вот и не допру как сделать).
9 авг 11, 16:33    [11092770]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Super_DJ
Владимир СА,

Нет, пока формировать на клиенте не получится.

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

Разжевано (с примерами) в BOL. Но, вполне возможно и получится ВНЕЗАПНО напрячь iap сделать вашу работу))))))))).
Ща поглядим :).
9 авг 11, 16:43    [11092858]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Кстати, я думаю, что оптимальное решение предложил kDnZP в первом же ответе:
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(NUMBER,'-',''),' ',''),'?',''),'!',''),'@','').....
и т.д.
9 авг 11, 16:49    [11092921]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
Никого не хотел напряч своей работой, но за помощь спасибо.
Как и писал iap, пример с REPLACE работает хорошо (нашел свою ошибку). Понятно процедура как и функция завелась с пол-тычка. Но вот с триггером завал, никак не заводится. Пример FireBird
CREATE OR ALTER TRIGGER Table_TRIGGER01 FOR Table
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
  NEW.SCode = GETSCODE(NEW.Code);
END
GETSCODE имеется как dbo.GETSCODE(спасибо верхним постам)
Помогите переложить на MS.
10 авг 11, 16:38    [11099253]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Super_DJ
Никого не хотел напряч своей работой, но за помощь спасибо.
Как и писал iap, пример с REPLACE работает хорошо (нашел свою ошибку). Понятно процедура как и функция завелась с пол-тычка. Но вот с триггером завал, никак не заводится. Пример FireBird
CREATE OR ALTER TRIGGER Table_TRIGGER01 FOR Table
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
  NEW.SCode = GETSCODE(NEW.Code);
END
GETSCODE имеется как dbo.GETSCODE(спасибо верхним постам)
Помогите переложить на MS.


если вы расскажете что значит ACTIVE и POSITION 0 может и помогут
10 авг 11, 16:45    [11099331]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
WarAnt,

ACTIV - Определяет, что действие триггера дает эффект, когда тот запускается
POSITION 0 - Определяет порядок в котором срабатывают триггеры
10 авг 11, 17:19    [11099624]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Super_DJ
WarAnt,

ACTIV - Определяет, что действие триггера дает эффект, когда тот запускается
POSITION 0 - Определяет порядок в котором срабатывают триггеры
Что должно происходить при UPDATE-то?
Можете словами рассказать?
Может, и триггер не нужен...
10 авг 11, 17:27    [11099719]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
iap,
При UPDATE читается поле CODE, прогоняется через функцию, разультат записывается в соседнее поле SCODE
10 авг 11, 17:48    [11099903]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Super_DJ,

ну тогда навскидку нечто подобное
CREATE  TRIGGER Table_TRIGGER01 FOR Table
for UPDATE
AS
BEGIN
update n SET Code = GETSCODE(n.Code) FROM Table n JOIN inserted i ON n.[ключевое поле] = i.[ключевое поле]
END

но iap прав какой-то костыль получается может это можно сделать при самом update
10 авг 11, 17:52    [11099920]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
обжибся:)

CREATE  TRIGGER Table_TRIGGER01 FOR Table
for UPDATE
AS
BEGIN
update n SET SCode = GETSCODE(n.Code) FROM Table n JOIN inserted i ON n.[ключевое поле] = i.[ключевое поле]
END
10 авг 11, 17:55    [11099938]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое заполнение поля для поиска  [new]
Super_DJ
Member

Откуда: Königsberg in Preußen
Сообщений: 79
обжибся:)

Ничего, 'костыль' уже сам подправил, заработал как должно.
Спасибо=)
Теперь к INSERT такой же нахлабучить осталось, но думаю тут немногим сложнее будет)
10 авг 11, 18:14    [11100029]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить