我知道其他类似的问题已经在SO上发布和回答,但我没有发现任何真正满足我需求的内容。只是你知道,我知道如何编写基本的SQL查询,但我以前从未使用过触发器或存储过程 - 我正在学习。
因此,目标是创建一个触发器,只要插入记录,它就会在SQL Server中生成一个字母数字值。我使用以下脚本来创建我的表:
CREATE TABLE [ISSUES]
(
[IssueId] int identity(1, 1) PRIMARY KEY,
[IssueIdProxy] [nvarchar](20) NOT NULL,
...
)
当所述触发器启动时,应该按以下格式将字母数字值插入IssueIdProxy
列:ABC-00001
,ABC-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
生成的位数。此外,如果触发器脚本的任何部分没有意义或错误,请随时纠正我。
答案 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上运行。要使用它,您必须更新触发器以设置问题字段。