SQL Server: ฟังก์ชั่นไม่ทำงานในทริกเกอร์

ฉันมีทริกเกอร์ในการแทรกเช่นนั้น:

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

แต่มันไม่ทำงาน เมื่อฉันฟิลด์ 'hardcode' RefNumber เช่น: SET RefNumber = 'test' มันทำงานได้อย่างถูกต้อง

นอกจากนี้เมื่อฉันเรียกใช้ฟังก์ชันนอกทริกเกอร์ มันจะส่งคืนผลลัพธ์ที่เหมาะสม

และนี่คือฟังก์ชันของฉันที่ต้องส่งคืนค่าใน 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 

มีความคิดอะไรบ้างที่ฉันทำผิด?


person Harry Birimirski    schedule 16.05.2016    source แหล่งที่มา
comment
ฟังก์ชั่นทำงานนอกทริกเกอร์หรือไม่?   -  person Squirrel    schedule 16.05.2016
comment
ข้อความแสดงข้อผิดพลาดคืออะไร?   -  person ydoow    schedule 16.05.2016
comment
ใช่ ฟังก์ชั่นใช้งานได้จากภายนอก .. ฉันคิดว่าฉันพูดถึงมันในคำถามของฉัน: 'นอกจากนี้เมื่อฉันเรียกใช้ function นอกทริกเกอร์ มันจะส่งคืนผลลัพธ์ที่เหมาะสม' .. ฉันไม่รู้วิธีดีบักทริกเกอร์หรืออะไร   -  person Harry Birimirski    schedule 16.05.2016


คำตอบ (1)


ฟังก์ชันของคุณส่งคืนสิ่งที่อาจเป็นผลลัพธ์ที่ไม่ถูกต้องเมื่อ RefNumber = '' และจะส่งคืนค่า NULL เมื่อ RefNumber = NULL เช่นเดียวกับที่เกิดขึ้นกับบันทึกที่แทรกใหม่
การออกแบบโค้ดข้างต้นนั้นแย่มาก
แนวทางที่แนะนำ:
ใช้ฟิลด์ ID เป็นตัวนับและสร้าง RefNumber ตามนั้น โดยเชื่อมปีตามที่จำเป็น ฟังก์ชั่นตัวอย่าง:

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 

ตัวอย่างทริกเกอร์:

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

หรือสร้างตารางอื่นเพื่อเก็บเมล็ด RefNumber ปัจจุบัน

person Alex    schedule 16.05.2016
comment
ขอบคุณสำหรับคำอธิบาย .. คุณคงพูดถูก .. และ RefNumber เป็นโมฆะ .. ดังนั้นในฟังก์ชันของฉันฉันเพิ่งเพิ่มสิ่งนี้: WHERE RefNumber ไม่ใช่ null .. และนี่จะช่วยแก้ปัญหาของฉัน .. - person Harry Birimirski; 16.05.2016
comment
@Harry Birimirski ฉันดีใจที่ได้แก้ไขปัญหาเฉพาะหน้าของคุณด้วยฟังก์ชันนี้ ฉันแนะนำให้คุณเขียนมันใหม่ มีวิธีแก้ไขปัญหาหลายประการสำหรับความต้องการของคุณที่คุณสามารถเลือกดู: stackoverflow.com/questions/282943/ - person Alex; 16.05.2016