我有下表:
tbl_ProductCatg
Id IDENTITY
Code
Description
a few more.
Id字段自动递增,我必须在代码字段中插入此字段值。
即。如果Id生成为1则在代码字段中应该插入值,如0001(格式为长度为4),如果id为77则代码应为0077。
为此,我做了如下查询:
insert into tbl_ProductCatg(Code,Description)
values(RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4),'testing')
这个查询在sql server查询分析器中运行良好,但是如果我用C#编写它,那么它会在代码中隐藏Null,即使Id字段更新也很好。
由于
答案 0 :(得分:4)
您可能需要查看Computed Columns(Definition)
听起来你想要做的事情,这对你来说很有用。
CREATE TABLE tbl_ProductCatg
(
ID INT IDENTITY(1, 1)
, Code AS RIGHT('000' + CAST(ID AS VARCHAR(4)), 4)
, Description NVARCHAR(128)
)
或
ALTER TABLE tbl_ProductCatg
ADD Code AS RIGHT('000' + CAST(id AS VARCHAR(4)), 4)
您还可以将列设为PERSISTED
,以便每次引用时都不会计算该列。
将列标记为PERSISTED
指定数据库引擎将物理存储表中的计算值,并在更新计算列所依赖的任何其他列时更新值。
答案 1 :(得分:0)
不幸的是,SCOPE_IDENTITY并非设计为在插入期间使用,因此在插入发生之前不会填充该值。
我可以看到执行此操作的三个解决方案是创建存储过程以生成范围标识,然后更新字段。
insert into tbl_ProductCatg(Description) values(NULL,'testing')
update tbl_ProductCatg SET code=RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4) WHERE id=SCOPE_IDENTITY()
第二个选项是更进一步,使其成为一个在UPDATE和INSERT上运行的触发器。我总是被教导在可能的情况下避免使用触发器,而是在SP级别执行操作,但在某些情况下触发器是合理的。
第三个选项是计算字段,如@Adam Wenger所述