Laden...

Update innerhalb einer Funktion?

Erstellt von Atomroflman vor 14 Jahren Letzter Beitrag vor 14 Jahren 5.611 Views
A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 14 Jahren
Update innerhalb einer Funktion?

verwendetes Datenbanksystem: MSSQL 2008 EXPRESS

Hallo Ihrs,

ich möchte mir eine Funktion in SQL bauen die einen Wert aus einer Tabelle holt, den Wert hoch zählt und den neuen Wert an selbiger Stelle zurück schreibt.

Dabei bin ich auf folgendes gekommen:


CREATE FUNCTION GetNextRowId()
returns bigint
as 
begin 
	declare @lastval bigint 
	set @lastval = (select RowVal from dbo.testtab) 
	if @lastval is null set @lastval = 1
	set @lastval = @lastval + 1
	update dbo.SupplyRowId set RowId = @lastval
	return @lastval
end

dazu sagt das Management Studio:

Meldung 443, Ebene 16, Status 15, Prozedur GetNextRowId, Zeile 15
Ungültige Verwendung eines 'UPDATE'-Operators mit Nebenwirkungen innerhalb einer Funktion.

Darf ich in Funktionen prinzipiell kein update machen?

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo Atomroflman

Nein, du kannst generell kein UPDATE/INSERT/DELETE in Funktionen verwenden. Es gibt einen ekligen Trick über OPENROWSET, würde ich aber dringend von abraten.

Problem bei dem Konzept zeilenweise neue IDs zu generieren ist auch dass du sehr schnell große LOCK-Probleme bekommen kannst. Verwende stattdessen eine Prozedur mit der du einen Range von IDs selektieren kannst.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

S
26 Beiträge seit 2009
vor 14 Jahren

Darf ich in Funktionen prinzipiell kein update machen?

Richtig!
Folgendes geht mit einer UDF nicht:Die Datenbank oder Serverinstanz manipulieren
Daten verändern/hinzufügen/entfernen
Dynamisches SQL ausführen

Gruß

Sebastian

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 14 Jahren

Eigentlich suche ich nach einer Möglichkeit einen tabellenübergreifenden Zähler zu bauen.
Am liebsten wäre es mir halt wenn das in einer Funktion passiert, die quasi mitzählt wie oft sie aufgerufen wurde...

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
Atomroflman Themenstarter:in
266 Beiträge seit 2007
vor 14 Jahren

Oh mein Gott, bin ich stupide...

einfach an jede Tabelle eine Spalte mit datentyp Timestamp angehängt, tut genau das was ich wollte...

Dennoch danke für die Mühe... 😉

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

1.564 Beiträge seit 2007
vor 14 Jahren

Mal IDENTITY angeschaut?

Wenn dich ein TIMESTAMP glücklich macht könntest du von einer IDENTITY begeistert sein.
😁

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.