2017-02-15 22 views
3

Никогда не MERGE до, ни Sybase ASE 15.7SQL Merge. Обновление, когда выходит, вставить, если это не так, с помощью переменных в хранимой процедуре

мне нужна хранимая процедура для обновления существующих данных или вставить его, если он не существует. Я знаю, как это сделать без MERGE, но я хочу научиться его использовать.

Это мой стол и тестовые данные:

CREATE TABLE myTable(
    col1 Smallint Not NULL, 
    col2 Char(15) Not NULL, 
    col3 Char(2)  Not NULL, 
    col4 BIT Not NULL, 
    col5 varchar(100) NULL, 
    Constraint PK_myTable primary key clustered (col1,col2,col3) 
) 
go 

insert into myTable values(1,'A','1',1,'A') 
go 

Моя процедура

create procedure spInsertUpdateMytable(
     @col1 Smallint, 
     @col2 Char(15), 
     @col3 Char(2), 
     @col4 BIT, 
     @col5 varchar(100)) 
    AS 

    merge into myTable as V 
     using (select col1, col2, col3, col4, col5 from myTable 
       where @col1=col1 and @col2 = col2 and @col3=col3) as N 
     ON v.col1=n.col1 and v.col2=n.col2 and v.col3=n.col3 
     when not matched then 
      insert (col1, col2, col3, col4, col5) 
      values(@col1, @col2, @col3, @col4, @col5) 
     when matched 
      then update set 
       v.col4 = @col4, v.col5 = @col5 
go 

обновление, кажется, работает, но вставка не делает.

exec spInsertUpdateMytable 1,'A','1',0,'B' --Update is done ok. 

exec spInsertUpdateMytable 1,'C','1',0,'Z' --No new record added 

Я не могу понять, что я делаю неправильно, я отслеживаю эту Спекуляции Adaptive Server Enterprise 15.7 > Reference Manual: Commands > Commands

+1

Я думаю, проблема связана с фильтром в 'use', он не найдет никаких строк и, следовательно, не будет строк, которые не совпадают. –

+1

По сути, 'using'-clause нужно возвращать строки, которые либо будут вставлены, либо обновлены. 'On'-clause будет решающим фактором, если строка должна быть« сопоставлена ​​»или« не сопоставлена ​​» –

+0

@PeterHenell благодарит много, она работает. Я пропустил эту штуковину. – Horaciux

ответ

2

Просто сделал изменения @PeterHenell прокомментировал и woked.

create procedure spInsertUpdateMytable(
     @col1 Smallint, 
     @col2 Char(15), 
     @col3 Char(2), 
     @col4 BIT, 
     @col5 varchar(100)) 
    AS 

    merge into myTable as V 
     using (select @col1 col1, @col2 col2, @col3 col3, @col4 col4, @col5 col5) as N 

     when not matched then 
      insert (col1, col2, col3, col4, col5) 
      values(@col1, @col2, @col3, @col4, @col5) 
     when matched 
      then update set 
       v.col4 = @col4, v.col5 = @col5 
go 

 Смежные вопросы

  • Нет связанных вопросов^_^