2017-02-15 3 views
3

verwendet Nie MERGE vor noch Sybase ASE 15.7SQL-Zusammenführung. Update, wenn Ausfahrten, einfügen, wenn es nicht der Fall ist, unter Verwendung von Variablen in gespeicherten Prozedur

Ich brauche eine gespeicherte Prozedur für vorhandene Daten aktualisieren oder einfügen, wenn sie noch nicht existiert. Ich weiß, wie es ohne MERGE geht, aber ich möchte lernen, es zu verwenden.

Das ist mein Tisch und Testdaten:

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 

Mein Verfahren

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 

Update scheint zu funktionieren, aber Einsatz nicht.

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

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

Ich kann nicht erkennen, was ich falsch mache, verfolge ich dieses specs Adaptive Server Enterprise 15.7 > Reference Manual: Commands > Commands

+1

Ich denke, das Problem ist mit dem Filter in der 'using', es wird keine Zeilen finden und daher wird es keine Zeilen zu 'nicht übereinstimmen'. –

+1

Im Wesentlichen muss die 'using'-Klausel Zeilen zurückgeben, die entweder eingefügt oder aktualisiert werden. Die 'on'-Klausel wird der entscheidende Faktor sein, wenn die Zeile' matched 'oder' not matched 'sein soll. –

+0

@PeterHenell vielen Dank, es funktioniert. Ich habe das Loch-Ding nicht verstanden. – Horaciux

Antwort

2

Gerade die Änderung kommentiert @PeterHenell gemacht und es 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 
Verwandte Themen