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...
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ß.
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
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...
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...
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ß.