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

Откуда:
Сообщений: 31
Добрый день!
Пишу триггер на добавление новой строки (insert).
При данном коде триггера, запись новых строк не проходит... И скрипт не выполняется...
AFTER INSERT
AS 

	declare @nomer nvarchar(80)
	declare @mytext nvarchar
	
	set @mytext = select TOP 1 from inserted where MessageText LIKE '%code=%'
	set @nomer = MessageFrom
	
	if (@mytext != '')
		Begin
			insert into MessageOut (MessageText, MessageTo)
			select @mytext, @nomer
			from inserted
		end

Я хочу проверить созданную запись на наличии текста содержащего 'code='. Например: code=789456.
Если содержится, то отделить текст 'code=' и записать в переменную @mytext все что осталось справа с удалением пробелов.
Затем в другой таблице проверить наличие такого кода, если он есть то записать в переменную @valide = 'OK', а если нет то @valide = 'Error'.
Таблица для проверки имеет два столбца id и codes.

Помогите пожалуйста реализовать задуманное!
10 авг 15, 11:57    [17997867]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
kristow,
при вашем коде он у вас даже скомпилиться не должен

set @mytext = select TOP 1 from inserted where MessageText LIKE '%code=%'
set @nomer = MessageFrom


так не пишут, идите учите правильные синтаксические конструкции составления запросов и присвоения переменных

как вариант у вас должно было быть что то вида:
ALTER TRIGGER TR ON sometable
AFTER INSERT AS
    declare @valide varchar(255)
    set @valide = 'Error'
    DECLARE @tbl TABLE (Code VARCHAR(255), MessageTo VARCHAR(255))
    INSERT INTO @tbl (MessageText, MessageTo)
       SELECT
            RTRIM(SUBSTRING(MessageText, PATINDEX('%code=%', MessageText), DATALENGTH(MessageText)-PATINDEX('%code=%', MessageText)+1)),
            MessageTo
       FROM inserted
       WHERE MessageText LIKE '%code=%'

     if exists (select 1 from ValideTable v join @tbl t on t.Code = v.codes)
        set @Valide = 'OK' -- :-D


а из условия постановки задачи переменная @valide в триггере что вам даст?
10 авг 15, 12:26    [17998094]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
kristow
Member

Откуда:
Сообщений: 31
Поправил код, теперь работает простая проверка MessageText.
Подскажите как отделить текст code?
AFTER INSERT
AS 

	declare @nomer NVARCHAR(MAX);
	declare @mytext NVARCHAR(MAX);
	
	select @mytext = MessageText, @nomer = MessageFrom from inserted where MessageText LIKE '%code%';
	
	if (@mytext != '')
		Begin
			insert into MessageOut (MessageText, MessageTo)
			select @mytext+' ::: '+@nomer, @nomer
			from inserted
		end
10 авг 15, 12:27    [17998101]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
ALTER TRIGGER TR ON sometable
AFTER INSERT AS
    declare @valide varchar(255)
    set @valide = 'Error'
    DECLARE @tbl TABLE (Code VARCHAR(255), MessageTo VARCHAR(255))
    INSERT INTO @tbl (Code , MessageTo)
       SELECT
            RTRIM(SUBSTRING(MessageText, PATINDEX('%code=%', MessageText), DATALENGTH(MessageText)-PATINDEX('%code=%', MessageText)+1)),
            MessageTo
       FROM inserted
       WHERE MessageText LIKE '%code=%'

     if exists (select 1 from ValideTable v join @tbl t on t.Code = v.codes)
        set @Valide = 'OK' -- :-D

с колоночками ошибся ))
10 авг 15, 12:27    [17998102]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
kristow
Поправил код, теперь работает простая проверка MessageText.
Подскажите как отделить текст code?
AFTER INSERT
AS 

	declare @nomer NVARCHAR(MAX);
	declare @mytext NVARCHAR(MAX);
	
	select @mytext = MessageText, @nomer = MessageFrom from inserted where MessageText LIKE '%code%';
	
	if (@mytext != '')
		Begin
			insert into MessageOut (MessageText, MessageTo)
			select @mytext+' ::: '+@nomer, @nomer
			from inserted
		end


вы понимаете что в вашем случае переменной @mytext будет присвоено совершенно случайное значение из набора inserted?
если будет произведена вставка не одной строки а набора, вероятно вы получите немного не тот результат который хотели бы
10 авг 15, 12:35    [17998146]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
kristow, это задача не для триггера, а для процедуры. Единственный момент, для которого может потребоваться триггер для записи данных - это сохранение истории, да и то не всегда. Основная задача триггера - проверять корректность данных.
10 авг 15, 12:47    [17998244]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
kristow
Member

Откуда:
Сообщений: 31
Спасибо всем за ответы.
Мой триггер по простой проверке наличия нужного текста работает.
Пробовал код felix_ff, заметил ошибку о названии таблицы, исправил.

Получился вот такой код:
AFTER INSERT
AS 

	declare @nomer NVARCHAR(MAX);
	declare @mytext NVARCHAR(MAX);
	declare @valide varchar(255)
    set @valide = 'Error'
    select @nomer = MessageFrom from inserted where MessageText LIKE '%code%';
    DECLARE @tbl TABLE (Code nvarchar(50))
    INSERT INTO @tbl (Code)
       SELECT
            RTRIM(SUBSTRING(MessageText, PATINDEX('%code=%', MessageText), DATALENGTH(MessageText)-PATINDEX('%code=%', MessageText)+1))
       FROM inserted
       WHERE MessageText LIKE '%code%'
    
    if exists (select 1 from ValideTable v join @tbl t on t.Code = v.codes)
        Begin
			set @Valide = 'OK'
			insert into MessageOut (MessageText, MessageTo)
			select @Valide+' ::: '+@nomer, @nomer
			from inserted
		end
	else
		Begin
			insert into MessageOut (MessageText, MessageTo)
			select @Valide+' ::: '+@nomer, @nomer
			from inserted
		end


Таблицу создал ValideTable с id int и codes nvarchar(50).
Сделал запись с текстом codes = '456'.
Входящая строка с текстом code=456 отправляет ответ error. Почему?
10 авг 15, 13:19    [17998512]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1837
kristow,

 RTRIM(SUBSTRING(MessageText, PATINDEX('%code=%', MessageText)+5, DATALENGTH(MessageText)-PATINDEX('%code=%', MessageText)+1))
10 авг 15, 13:28    [17998589]     Ответить | Цитировать Сообщить модератору
 Re: Insert проверка текста в ячейке и работа с текстом  [new]
kristow
Member

Откуда:
Сообщений: 31
felix_ff спасибо большое за помощь!
Сейчас вроде все работает!
10 авг 15, 13:34    [17998634]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить