2015-06-05 2 views
0

Я пытаюсь написать триггер SQL Server, который объединяет 3 столбца, но вставляет строку вместо третьего столбца на основе условия.SQL-сервер trigger concat

Например, если col 1 вставлен concat col 1, col 2 и col 3. Но когда col 3 = 'DR' CONCAT Drive или col 3 = 'ST' CONCAT Street и т.д.

Я могу написать триггер для всех 3-х колонок, но возникли проблемы с условной.

CREATE TRIGGER updateAddress 
    ON [ARCHIVENEW].dbo.a11 
    AFTER UPDATE 
AS BEGIN 
    SET NOCOUNT ON; 
    IF UPDATE(STRNAME) 
    SELECT CASE 
     WHEN a11.STRTYPE = 'DR' THEN dbo.a11.STRFNAME = cast(dbo.a11.STRADDLF as varchar(2)) + ' ' + STRNAME + ' ' + 'Drive' 
     WHEN a11.STRTYPE = 'RP' THEN dbo.a11.STRFNAME = cast(dbo.a11.STRADDLF as varchar(2)) + ' ' + STRNAME + ' ' + 'Ramp' 
     WHEN a11.STRTYPE = 'EX' THEN dbo.a11.STRFNAME = cast(dbo.a11.STRADDLF as varchar(2)) + ' ' + dbo.a11.STRNAME + ' ' + 'Express Way' 
     ELSE dbo.a11.STRFNAME = cast(dbo.a11.STRADDLF as varchar(2)) + ' ' + dbo.a11.STRNAME 
END 

Извините, потребовалось несколько дней, чтобы вернуться к этому вопросу и добавить образец кода. Я получаю синтаксическую ошибку около '=', где я пытаюсь установить STRFNAME в конкатенированную строку. Чтобы уточнить, col1 - «1234» col2 - «Main», а col3 - «ST». Когда вставлена ​​строка, я хотел бы, чтобы col4 сказал «1234 Main Street».

+4

Вы пробовали использовать CASE? Не видя кода, мы можем только догадываться о том, что вы пытаетесь сделать. –

+0

Спасибо, Джозеф, я пробовал использовать CASE, но получаю синтаксическую ошибку. Завтра я по телефонам отправлю код. –

+1

хорошо, если у вас есть синтаксическая ошибка, вам просто нужно внимательно посмотреть на свой код и посчитать свой END и запятые и так, прежде чем отправлять код. –

ответ

0

Пример таблица:

CREATE TABLE dbo.TestTable(
    Id INT IDENTITY(1,1) PRIMARY KEY 
    ColA VARCHAR(50), 
    ColB VARCHAR(50), 
    ColC VARCHAR(50), 
    ColD VARCHAR(50) 
); 

Этого триггер concats значение Колы ColB для ColC и проверяет значение ColB для холода.

CREATE TRIGGER TestTable_UpdateTwoColumns 
    ON dbo.TestTable 
    AFTER INSERT,UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF UPDATE(ColA) 
    BEGIN 
     UPDATE dbo.TestTable 
     SET  ColC=new.ColA + new.ColB 
     FROM INSERTED new 
    END 
    IF UPDATE(ColB) 
    BEGIN 
     UPDATE dbo.TestTable 
     SET ColD=CASE new.ColB WHEN 'DR' THEN 'Drive' WHEN 'ST' THEN 
     'Street' END 
     FROM INSERTED new 
    END 
END 

Спасибо,

0

Вы не можете изменить таблицу в то время как триггер INSERT стреляет. Тем не менее, вы можете создать триггер перед вставкой записи.

CREATE TRIGGER emplog_update ПОСЛЕ UPDATE ON EMP ДЛЯ КАЖДОЙ СТРОКЕ INSERT INTO emplog (идентификатор, lastnmae, Firstname,...) выберите NEW.id, NEW.lastname, NEW.firstname, NEW.gender, NEW. dob, NEW.marital, NEW.SSN, 'U', NULL, USER(), concat_ws (',', (case when new.id <> old.id then 'id' end), (case when new.lastname <> old.lastname then endname), (case when new.firstname <> old.firstname then 'firstname' end), ... );

0

Если ваш девиз вставляется в третий столбец, полезно использовать вычисленную колонку. Вот пример. Но, как и в моем комментарии к вопросу, я не понял, как приходит значение col3?

Для этого я использовал col4 для получения правильного результата, также в вычисляемом столбце define, он не берет на себя ссылку.

CREATE TABLE dbo.Products 
    (
     ProductID int IDENTITY (1,1) NOT NULL 
     , col1 varchar(50) 
     , col2 varchar(50) 
     , col3 varchar(50) 
     , col4 AS case col3 when 'DR' then 'Drive' when 'ST' then 'Street' else col1 + col2 end 
    --while computed column define, you can use all other column, except own. 
    ); 

    -- Insert values into the table. 
    INSERT INTO dbo.Products (col1, col2,col3) 
    VALUES ('a', 'a1','a2'), ('b', 'b1', 'DR'), ('c', 'c1', 'ST'), ('d', 'd1', 'd2'); 

    -- Display the rows in the table. 
    SELECT ProductID, col1, col2, col3, col4 
    FROM dbo.Products; 

    select * from products 

    drop table products