用于创建字母数字值的SQL Server触发器

时间:2014-06-25 14:38:11

标签: sql-server tsql triggers

我知道其他类似的问题已经在SO上发布和回答,但我没有发现任何真正满足我需求的内容。只是你知道,我知道如何编写基本的SQL查询,但我以前从未使用过触发器或存储过程 - 我正在学习。

因此,目标是创建一个触发器,只要插入记录,它就会在SQL Server中生成一个字母数字值。我使用以下脚本来创建我的表:

CREATE TABLE [ISSUES]
(
    [IssueId] int identity(1, 1) PRIMARY KEY,
    [IssueIdProxy] [nvarchar](20) NOT NULL,
    ...
)

当所述触发器启动时,应该按以下格式将字母数字值插入IssueIdProxy列:ABC-00001ABC-00002,...,{{1 }}, 等等。如您所见,非数字部分(即“ABC”)保持不变;对于下一条记录,只有数字部分加1。至于触发器脚本,我有:

ABC-00015

我的挑战是保持值的数字部分始终为六位数。我需要知道如何控制前导零的数量,具体取决于随着记录大小的增长从CREATE TRIGGER alphaNumericKey ON ISSUES AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE a SET IssueIdProxy = 'ABC' + LEFT('0000' + CAST(inserted.IssueId AS VARCHAR(10)), 5) FROM ISSUES a INNER JOIN inserted ON a.IssueId = inserted.IssueId END 生成的位数。此外,如果触发器脚本的任何部分没有意义或错误,请随时纠正我。

1 个答案:

答案 0 :(得分:1)

更好的解决方案是。

SET IssueIdProxy=CONCAT('ABC',FORMAT(inserted.IssueId,'0000'))

format命令将填充IssueId中传递给它的String中的所有空字段。在我们的案例中' 0000'四个零。它将返回一个nvarchar。 Concat会将此添加到' ABC'。

触发器仅在初始插入完成后运行。因为您将代理字段设置为非null,所以如果尝试插入而不指定代理值,则会出现错误,将引发错误。

为避免这种情况,您可以:

1:从代理字段中删除not null。 - 如果使用更新命令,则会冒这里出现空值的风险。除非您创建一个与上面相同的更新触发器。您可以将默认值0添加到代理字段,因此即使设置为null,也会显示默认值0并防止出错。

2:保持null并将仲裁值插入代理字段。插入完成后,触发器将覆盖它。

3:将您的触发器更改为INSTEAD OF INSERT。这意味着您的insert命令将被完全忽略,只有触发器将在insert上运行。要使用它,您必须更新触发器以设置问题字段。