2016-05-16 8 views
0

I-Trigger für Insert so haben:SQL Server: Funktion funktioniert nicht in Trigger

ALTER TRIGGER [dbo].[trTblNameSetRefNo]  
ON [dbo].[TblName] 
AFTER INSERT 
AS BEGIN 
    UPDATE TblName 
    SET RefNumber = dbo.GetNextRefNo(i.SomeField) 
    FROM TblName 
    INNER JOIN inserted i on i.ID = TblName.ID 
END 

Aber es funktioniert nicht. Wenn ich das RefNumber-Feld "hardcodieren", zum Beispiel: SET RefNumber = 'test', funktioniert es korrekt.

Auch wenn ich Funktion außerhalb des Abzugs nennen, bringen Sie es richtige Ergebnis.

Und das ist meine Funktion, die den Wert in Trigger zurückgeben muss:

ALTER FUNCTION [dbo].[GetNextRefNo] 
    (@ValueField INT) 
RETURNS NVARCHAR(250) 
AS 
    BEGIN 
     DECLARE @lastId INT; 
     DECLARE @result NVARCHAR(25); 
     DECLARE @CurrentIdentifier NVARCHAR(25); 

     SELECT TOP 1 
      @lastId = CAST(Substring(RefNumber, Charindex('-', RefNumber) + 4, Len(RefNumber)) AS INT) + 1 
     FROM 
      TblName 
     ORDER BY 
      ID DESC 

     IF @@ROWCOUNT < 1 --if empty table , set start number 
     BEGIN 
      SET @lastId = 1000 
     END 

     SELECT @CurrentIdentifier = 'SIT' 

     SET @result = @CurrentIdentifier + '-' + Substring (Cast(Year(Getdate()) AS NVARCHAR), 3, 2) + '-' + Cast(@lastId AS NVARCHAR) 

     RETURN @result 
    END 

Irgendwelche Ideen, was ich falsch mache?

+1

funktioniert die Funktion außerhalb eines Trigger funktioniert? – Squirrel

+0

Was ist die Fehlermeldung? – ydoow

+0

Ja, Funktion von außen funktioniert .. Ich glaube, ich Mantion es in meiner Frage: ‚Auch wenn ich Funktion außerhalb des Abzugs nennen, es richtiges Ergebnis zurück.‘ .. Ich erhalte keinen Fehler, ich weiß nicht, wie man Trigger auslöst oder so etwas? –

Antwort

1

Ihre Funktion gibt, was wahrscheinlich ein falsches Ergebnis, wenn RefNumber = ‚‘ und es gibt NULL zurück, wenn RefNumber = NULL, wie es für eine neu eingefügte Datensatz passieren würde.
Das Design des obigen Codes ist darüber hinaus schlecht.
vorgeschlagener Ansatz:
Verwenden ID-Feld als Zähler und erzeugen RefNumber basiert darauf, dass, während Jahr concatating nach Bedarf. Beispiel Funktion:

ALTER FUNCTION [dbo].[GetNextRefNo] (@ID INT) 
returns NVARCHAR(250) 
AS 
BEGIN 
    DECLARE @lastId INT; 
    DECLARE @result NVARCHAR(25); 
    DECLARE @CurrentIdentifier NVARCHAR(25); 

    SELECT @CurrentIdentifier = 'SIT' 
    SET @ID = @ID + 1000 

    SET @result = @CurrentIdentifier + '-' + Substring (Cast(Year(Getdate()) AS NVARCHAR), 3, 2) + '-' + Cast(@ID AS NVARCHAR) 
    RETURN @result 
END 

Beispiel Trigger:

ALTER TRIGGER [dbo].[trTblNameSetRefNo] ON [dbo].[TblName] 
AFTER INSERT AS BEGIN 

    UPDATE TblName 
    SET RefNumber = dbo.GetNextRefNo(i.ID) 
    FROM TblName 
    INNER JOIN inserted i on i.ID = TblName.ID 

END 

erstellen Alternativ andere Tabelle den aktuellen RefNumber Samen zu halten.

+0

Vielen Dank für die Erklärung .. Sie haben wahrscheinlich Recht .. und RefNumber ist Null .. so in meiner Funktion habe ich gerade hinzugefügt: \t WHERE RefNumber ist nicht null .. und das löst mein Problem .. –

+0

@Harry Birimirski, ich bin froh Ich habe dein unmittelbares Problem mit der Funktion gelöst. Ich rate dir jedoch, es neu zu schreiben. Es gibt mehrere Lösungen für Ihre Anforderung, aus denen Sie wählen können: http://stackoverflow.com/questions/282943/how-would-you-implement-sequences-in-microsoft-sql-server – Alex