2016-05-16 92 views
0

不工作我有扳機上插入這樣的:的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 

但它不工作。當我'硬編碼'字段的RefNumber,例如:SET RefNumber = 'test',它工作正常。

另外,當我在觸發器外調用函數時,它會返回正確的結果。

這是我的函數必須在觸發返回值:

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 

任何想法我做錯了嗎?

+1

該功能是否在觸發器外工作? – Squirrel

+0

什麼是錯誤信息? – ydoow

+0

是的,功能從外面工作..我想我在我的問題mantion:'也當我在觸發器外調用函數,它會返回正確的結果。 ..我沒有收到任何錯誤,我不知道如何調試觸發器或什麼? –

回答

1

您的函數在RefNumber ='時返回可能不正確的結果,並且在RefNumber = NULL時返回NULL,就像新插入的記錄會發生一樣。
上面的代碼的設計超越了糟糕。
建議的方法:
使用ID字段作爲計數器,並根據該字段生成RefNumber,並根據需要生成Year。 實施例功能:

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種子。

+0

感謝您的解釋..你可能是正確的..和RefNumber是空..所以在我的功能,我只是加了這個:\t WHERE RefNumber不爲空..並且這解決了我的問題.. –

+0

@Harry Birimirski,我很高興我用這個函數解決了你的直接問題。我建議你改寫它。有幾種解決方案可以選擇您的需求,請參閱:http://stackoverflow.com/questions/282943/how-would-you-implement-sequences-in-microsoft-sql-server – Alex