2016-05-16 94 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