Fehler bei INSERT innerhalb einer Funktion in MS-SQL

kwmaster

Mitglied
Hallo zusammen,

habe folgende Funktion im MS-SQL-Server2005 erstellt (hier als ALTER):

ALTER FUNCTION [dbo].[TAXNum2] (@DocNum as int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @TAXNum int
Declare @anz int
Declare @VISNum int
IF NOT EXISTS (Select DocNum from OTSI Where DocNum = @DocNum)
BEGIN
DECLARE tab_cursor CURSOR FOR
select
t1.VISNum
from
otsi t0 inner join
VAI_TAX_VIS t1 on t0.DocNum = t1.TAXNum
where
t0.Canceled = 'Y';

OPEN tab_cursor;
FETCH NEXT FROM tab_cursor INTO @VISNum;
WHILE (@@FETCH_STATUS = 0)
Begin
IF NOT EXISTS (select t1.VISNum from otsi t0 inner join VAI_TAX_VIS t1 on t0.DocNum = t1.TAXNum where t0.Canceled = 'N' AND t1.VISNum = @VISNum)
BEGIN
SET @TAXNum = @VISNum
BREAK
END
ELSE
FETCH NEXT FROM tab_cursor INTO @VISNum;
End
CLOSE tab_cursor;
DEALLOCATE tab_cursor;

IF ISNULL(@TAXNum,0)=0
BEGIN
SET @TAXNum = (Select MAX(VISNum)+1 from VAI_TAX_VIS )
END
-- Write new values in VAI_TAX_VIS-Table
INSERT INTO VAI_TAX_VIS_TEST VALUES (@DocNum, @TAXNum);
-- set @taxnum = 666 -- to see that this line is accessed
END
ELSE
Begin
SET @TAXNum = -1
End
RETURN(@TAXNum)
END;

Aufgrund der INSERT-Zeile erhalte ich folgenden Fehler:
Msg 443, Level 16, State 15, Procedure TAXNum2, Line 41
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function.


Da ich jedoch innerhalb der Funktion diese Tabelle updaten muß, bin ich über jede Idee von Euch dankbar :confused:

Gruß

Kai
 
Benutze bitte das nächstemla die Code-Tags, sonst wird keiner Lust haben deinen Code anzuschauen.
Schon mit ner Suchmaschine nach dem Fehler gesucht?
 
Die Suche sagt, dass man innerhalb von Funktionen keine INSERTS durchführen darf...
Irgendwie muß das doch aber funktioniren, oder?

Gruß

Kai
 
Hallo Kai,

die Suche und der MS-SQL Server sagen leider die Wahrheit.
Innerhalb von Funktionen kann ausser in Temp-Tabellen kein Insert
durchgeführt werden! Dein Problem erinnert mich sehr stark an eine Query für eine
Reporting-Komponente? Falls es sich bei Deiner Lösung um eine eigenen Applikation
handelt, könntest Du die Logik in Deinen Code einbauen.

ks
 
Leider ist dem nicht so...

Ich brauche die Query für SAP Business One um eine eindeutige durchgängige Nummer zu generieren.
Sollte ein Dokument storniert worden sein, so muß diese Nummer wieder für ein neues Dokument verwendet werden.

Aus diesem Grunde brauche ich die Temp-Tabelle, die ich mit dem Insert füllen muss...

Ich habe mal über diese Extended Stored Procedures gelesen, dass sie in Funktionen aufgerufen werden können, leider habe ich es nicht hinbekommen, solch eine erfolgreich zu erstellen (Wollte eine Funktion in VB.NET als DLL erstellen und einklinken - konnte aber nicht auf die Funktion zugreifen...)

Also wenn noch jemand einen Vorschlag haben sollte... ich freue mich :)

Gruß

Kai
 
Ich hoffe Du machst die Änderungen nicht direkt im SAP - System.
Ale Ehemaliger sehe ich das nicht gerne. ;-)

Es gibt zwei Arten von Temp-Tabellen.
@TEMPTAB = wird nach Beendigung der Funktion wieder gelöscht und
kann nur von dem aktuellen User verwendet werden.
@@TEMPTAB = kann nach dem Ende der Funktion wieder verwendet werden.
Nachteil, jeder kann zugreifen und Du must im Vorfeld überprüfen ob die Tabelle
noch befüllt ist.
Wichtig! Transaktionale Steuerung und nur für einen einzigen Prozess verwenden!

ks
 
Na ja.... bei SBO darf man eh nicht direkt in den SAP-Tabellen herumfummeln (Nur SELECT ;))

Habe es jetzt über einen Trigger gelöst, der mir beim Hinzufügen eines Eintrag in der Tabelle die Daten nochmals in meine Temp-Tabelle schreibt!

Trotzdem nochmal vielen Dank

Kai
 
Zurück