Hallo,
wenn ich Sätze updaten, bzw. ggf inserten muß, falls noch nicht vorhanden, behelfe ich mich mit einem etwas üppigen T-SQL Konstrukt. Die Tabelle hat 2 Spalten, ID ist PK.
T-SQL (SQL Server 2005):
if ((select count(*) FROM [dbo].[Zinsberechnung] WHERE ID = '73d9bc97-65dd-4850-85c0-0b5bfd796105')>0)
update [r1].[Zinsberechnung] set Bezeichnung='Blabla' where ID = '73d9bc97-65dd-4850-85c0-0b5bfd796105'
else
insert into [dbo].[Zinsberechnung](ID, Bezeichnung) values ('73d9bc97-65dd-4850-85c0-0b5bfd796105', 'Blabla' )
GO
Kennt jemand da eine Abkürzung?
Falls nicht, gehe ich hin und mache mir eine Stored Procedure hierfür.
Leider muß ich dann für jede Tabelle eine eigene machen, aber es ginge schon.
Falls jemand einen generellen kürzeren Mechanismus kennt, freue ich mich über eine Info.
Gruß hape
Naja die Frage ist eher wieso du so etwas überhaupt machen musst?
Wenn du es aber so umsetzen willst, wirst du nicht drum herum kommen zu prüfen ob es den Datensatz gibt und dann entsprechend zu handeln.
Ich hätte es wenn dann mit 'IF EXISTS' gemacht, aber ich denke performancemässig wirds gleich bleiben.
Das ganze kannste natürlich auch in eine SP reinknallen. Diese übergibst halt die Tabelle, Spalten und Parameter und dann kommste auch mit einer aus.
Wenn das Standartwerte sein sollen, würde es sich vielleicht anbieten beim initialiseren der Anwendung die Datenbank zu überprüfen ob die Struktur und Daten alle vorhanden sind. Dann müsstest du nicht bei jedem UPDATE prüfen ob der Wert schon da ist oder nicht, da dies bei entsprechender Frequentierung auch gut auf die Performance gehen wird.
Gruß,
Tom
Hallo Tom,
danke für Deine Antwort. Die Anforderung ist, dass ein Script über ein Datenbestand huschen soll, und Fehlendes ergänzen, und Altes updaten soll.
Deine Idee mit den Tabellenvariablen interessiert mich.
Die stored procedure kriege ich für eine konkrete Tabelle hin, aber wie geht das mit den Tabellenvariablen? Alle betreffenden Tabellen haben eine Spalte ID sowie eine Spalte Bezeichnung.
ALTER PROCEDURE [dbo].[ZinsberechnungFill]
(
@tabname table( ***wie geht das**** ),
@ID uniqueidentifier,
@Bezeichnung nvarchar(60)
)
AS
BEGIN
if ((select count(*) FROM [dbo].[Zinsberechnung] WHERE ID = @ID)>0)
update @tabname set Bezeichnung=@Bezeichnung where ID = @ID
else
insert into @tabname(ID, Bezeichnung) values (@ID, @Bezeichnung)
END
...
execute [dbo].[ZinsberechnungFill] @tabname='dbo.Zinsberechnung', @ID = '73d9bc97-65dd-4850-85c0-0b5bfd796105', @Bezeichnung = 'Basiszins'
GO
Gruß Hape
Für so was verwende ich in der Regel StoredProcedures.
Was aber auch möglich wäre, wäre einen Trigger auf die Tabelle zu setzen, der bei einem Insert auf die Tabelle genau das gleiche macht.. Kommt eben drauf an wie du die Tabelle noch verwendest und was mehr deinem Geschmack entspricht (Solange wie du es nicht machst wie ichs kürzlich gesehen hab. Try-Catch um Insert und dann im Catch den Update wenn der Insert schief gegangen ist 😕)
Das geht so nicht, weil kein Ausführungsplan erstellt werden kann.
Wenn Du es dynamisch machen möchtest dann geht das nur über z.b. exec(@sql);
Verwende if(exists)
Gruß Jörg
ALTER PROCEDURE [dbo].[ZinsberechnungFill]
(
@TabName NVARCHAR(200),
@ID UNIQUEIDENTIFIER,
@Bezeichnung NVARCHAR(60)
)
AS
BEGIN
DECLARE @SQL NVARCHAR(500)
SELECT @SQL = 'IF EXISTS(SELECT [ID] FROM ' + @TabName + ' WHERE ID = @ID)
UPDATE ' + @TabName + ' SET Bezeichnung = @Bezeichnung WHERE ID = @ID
ELSE
INSERT INTO ' + @TabName + ' (ID, Bezeichnung) VALUES (@ID, @Bezeichnung)'
EXECUTE SP_EXECUTESQL @SQL, N'@ID UNIQUEIDENTIFIER, @Bezeichnung NVARCHAR(60)', @ID, @Bezeichnung
END
So würde deine SP dann aussehen. Habs jetzt nur auf MSSQL2k getestet da ich nicht auf der 2005er Version arbeite.
Gruß,
Tom