SQL Server: fungsi tidak berfungsi di pemicu

Saya memiliki pemicu pada penyisipan seperti itu:

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

Tapi itu tidak berhasil. Ketika saya 'hardcode' bidang RefNumber, misalnya: SET RefNumber = 'test', itu berfungsi dengan benar.

Juga ketika saya memanggil fungsi di luar pemicu, itu mengembalikan hasil yang sesuai.

Dan inilah fungsi saya yang harus mengembalikan nilai di trigger :

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 

Adakah ide apa yang saya lakukan salah?


person Harry Birimirski    schedule 16.05.2016    source sumber
comment
apakah fungsinya bekerja di luar pemicu?   -  person Squirrel    schedule 16.05.2016
comment
Apa pesan kesalahannya?   -  person ydoow    schedule 16.05.2016
comment
Ya, fungsi berfungsi dari luar.. Saya rasa saya menyebutkannya dalam pertanyaan saya: 'Juga ketika saya memanggil fungsi di luar pemicu, itu mengembalikan hasil yang sesuai.' .. Saya tidakt receive any error , i dont tahu cara men-debug pemicu atau semacamnya?   -  person Harry Birimirski    schedule 16.05.2016


Jawaban (1)


Fungsi Anda mengembalikan hasil yang mungkin salah ketika RefNumber = '' dan mengembalikan NULL ketika RefNumber = NULL, seperti yang akan terjadi pada catatan yang baru disisipkan.
Desain kode di atas sangat buruk.
Pendekatan yang disarankan:
Gunakan bidang ID sebagai penghitung dan hasilkan RefNumber berdasarkan bidang tersebut, sambil menggabungkan Tahun sesuai kebutuhan. Contoh fungsi:

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 

Contoh Pemicu:

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

Alternatifnya, buat tabel lain untuk menampung benih RefNumber saat ini.

person Alex    schedule 16.05.2016
comment
Terima kasih atas penjelasannya .. Anda mungkin benar .. dan RefNumber adalah null.. jadi dalam fungsi saya, saya baru saja menambahkan ini: WHERE RefNumber is not null .. dan ini menyelesaikan masalah saya .. - person Harry Birimirski; 16.05.2016
comment
@Harry Birimirski, saya senang saya menyelesaikan masalah langsung Anda dengan fungsi tersebut. Saya menyarankan Anda untuk menulis ulang. Ada beberapa solusi untuk kebutuhan Anda, Anda dapat memilih lihat: stackoverflow.com/questions/282943/ - person Alex; 16.05.2016