2016-02-03 3 views
0

Представьте, что у меня есть таблица с именем «TableA», и эта таблица имеет столбцы «IDtable», «Tabname» и «Suffix».Сохраненная процедура получения части названия записей из таблицы?

Идентификатор и табуляция правильно заполнены, но суффикс имеет все записи null.

Мне нужно разработать хранимую процедуру, которая позволяет заполнить столбец Суффикс. Для этого я знаю, что мне нужно отфильтровать имя записей в tabname.

Пример:

TABNAME: a_type_price Суффикс: цена

TABNAME: a_d_ser_sales Суффикс: продаж

Я думаю, что я должен разработать для цикла, который ищет «_» в именах Tabname и фильтрует все после последнего «_».

У кого-нибудь есть идеи по наилучшему способу выполнения этой хранимой процедуры?

+0

A.R.R., ваше изменение затрудняло поиск и для будущих пользователей. Я вернул его обратно. Ваше предложенное редактирование для моего ответа также сделает сообщение намного менее полезным для будущих пользователей, и я отклонил его. Имейте в виду, что StackOverflow - это сообщество, и вопросы здесь должны быть для будущих читателей, по крайней мере, так же, как и для искателя/ответчика. –

ответ

1

Вы хотите обновить таблицу - вам даже не нужна хранимая процедура, если это не то, что вам нужно выполнить как задание или часто.

Вы могли бы сделать так, как это:

CREATE PROCEDURE usp_Upd_TableASuffix() 
AS 
BEGIN 
SET NOCOUNT ON 
UPDATE TableA SET Suffix = RIGHT(Tabname, CHARINDEX('_', REVERSE(Tabname)) - 1) 
END 

Краткое объяснение того, что: Вы хотите RIGHT часть строки после последнего _ символа - получить последний, использовать CHARINDEX на REVERSE из строка.

Вы не можете сделать это с ограничением по умолчанию, так как вы должны ссылаться на другую колонку, но вы можете использовать триггер, предполагая IDtable ваш первичный ключ:

CREATE TRIGGER trg_TableA_Suffix 
ON TableA 
AFTER INSERT, UPDATE 
AS 
    UPDATE TableA SET Suffix = RIGHT(i.Tabname, CHARINDEX('_',REVERSE(i.Tabname))-1) 
    FROM inserted i 
    WHERE TableA.IDTable = i.IDTable 
GO 

Обратите внимание, что это выигранный» t, если IDTable не является уникальным, или если вашей таблице не хватает первичного ключа полностью.

Один последний вариант - и это, пожалуй, лучше всего, если вы действительно хотите, чтобы Suffix всегда содержать только последнюю часть Tabname и не хотите, чтобы изменить его - вы могли бы сделать Suffix вычисляемый столбец.

ALTER TABLE TableA DROP COLUMN Suffix 
ALTER TABLE TableA ADD Suffix AS RIGHT(Tabname, CHARINDEX('_',REVERSE(Tabname))-1) PERSISTED 
1

Для Informix.

Как @ дан-поле сказал, и объяснить, что вы можете сделать обновление с помощью:

UPDATE tablea 
SET suffix = RIGHT(tabname, CHARINDEX('_', REVERSE(tabname)) - 1); 

Другой способ:

UPDATE tablea 
SET suffix = SUBSTR(tabname, INSTR(tabname, '_', -1)+1); 

INSTR даст вам индекс первого вхождения из справа (-1) от «». SUBSTR предоставит вам подстроку, начиная с передаваемого вами индекса, в этом случае мы добавим 1, потому что мы не хотим выводить ''.

Имейте в виду, что RIGHT, CHARINDEX, REVERSE и INSTR функции доступны только 11.70 вперед.

На 11.50 вы можете попробовать это уродливое решение:

CREATE PROCEDURE test() 
    DEFINE i_IDtable LIKE tablea.IDtable; 
    DEFINE c_suffix LIKE tablea.tabname; 
    DEFINE i INT; 

    FOREACH cur1 WITH HOLD FOR 

     SELECT IDtable ,Tabname 
     INTO i_IDtable, c_suffix 
     FROM tablea 

     LET i = LENGTH(c_suffix); 

     WHILE i > 0 
      IF SUBSTR(c_suffix,i) LIKE '\_%' THEN 
       LET c_suffix = SUBSTR(c_suffix,i+1); 
       EXIT WHILE; 
      ELSE 
       LET i = i -1; 
      END IF 
     END WHILE; 

     UPDATE tablea 
     SET suffix = c_suffix, 
     WHERE idtable = i_IDtable; 

    END FOREACH; 
END PROCEDURE; 

Но если суффикс всегда эта часть tabname это не очень хорошая практика, чтобы хранить на столе.

Вы можете легко получить его из уже сохраненного tabname. И даже программно с этим легко справиться.