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
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'. –
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. –
@PeterHenell vielen Dank, es funktioniert. Ich habe das Loch-Ding nicht verstanden. – Horaciux