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'
работает правильно.
Также, когда я вызываю функцию вне триггера, она возвращает правильный результат.
И это моя функция, которая должна возвращать значение в триггере:
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 ответ
Ваша функция возвращает неправильный результат, когда RefNumber = '', и возвращает NULL, когда RefNumber = NULL, как это было бы для вновь вставленной записи.
Дизайн приведенного выше кода за пределами плохого.
Предлагаемый подход:
Используйте поле идентификатора в качестве счетчика и на его основе создайте 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.