【问题标题】:SQL Server : function not working in triggerSQL Server:函数在触发器中不起作用
【发布时间】:2016-09-11 20:54:20
【问题描述】:

我有这样的插入触发器:

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 

任何想法我做错了什么?

【问题讨论】:

  • 该函数是否在触发器之外工作?
  • 错误信息是什么?
  • 是的,函数从外部工作。我想我在我的问题中提到它:'另外,当我在触发器之外调用函数时,它会返回正确的结果。 .. 我不知道t receive any error , i dont 知道如何调试触发器什么的?

标签: sql-server triggers sql-function


【解决方案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 种子。

【讨论】:

  • 感谢您的解释..你可能是对的..而且 RefNumber 为空.. 所以在我的函数中我只是添加了这个:WHERE RefNumber is not null ..这解决了我的问题..跨度>
  • @Harry Birimirski,我很高兴我用这个功能解决了你的直接问题。我建议你重写它。有几种解决方案可以满足您的要求,请参阅:stackoverflow.com/questions/282943/…
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 2013-10-07
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多