Laden...

[T-SQL] INSERT implizites UPDATE

Erstellt von hape vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.069 Views
hape Themenstarter:in
121 Beiträge seit 2006
vor 17 Jahren
[T-SQL] INSERT implizites UPDATE

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

T
433 Beiträge seit 2006
vor 17 Jahren

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

hape Themenstarter:in
121 Beiträge seit 2006
vor 17 Jahren

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

T
327 Beiträge seit 2006
vor 17 Jahren

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 😕)

484 Beiträge seit 2006
vor 17 Jahren

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

T
433 Beiträge seit 2006
vor 17 Jahren
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

hape Themenstarter:in
121 Beiträge seit 2006
vor 17 Jahren

Wow!
Vielen Dank Euch allen für die schnelle Hilfe!
Gruß Hape