Sql server 从C代码中获取SQL Server 2008中自动递增的字段值

Sql server 从C代码中获取SQL Server 2008中自动递增的字段值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有下表: tbl_产品目录 Id IDENTITY Code Description a few more. Id字段是自动递增的,我必须在代码字段中插入此字段值 i、 e.如果生成的Id为1,则应在代码字段中插入值,如0001格式,长度为4,如果Id为77,则代码应为0077 为此,我进行了如下查询: insert into tbl_ProductCatg(Code,Description) values(RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+

我有下表:

tbl_产品目录

Id    IDENTITY
Code
Description
a few more.
Id字段是自动递增的,我必须在代码字段中插入此字段值

i、 e.如果生成的Id为1,则应在代码字段中插入值,如0001格式,长度为4,如果Id为77,则代码应为0077

为此,我进行了如下查询:

insert into tbl_ProductCatg(Code,Description)
values(RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4),'testing')
此查询在SQLServer查询分析器中运行良好,但如果我用C编写此查询,则即使Id字段更新良好,它也会在代码中插入Null

谢谢

您可能想看看

从听起来你正试图做的事情来看,这对你来说很有用

CREATE TABLE tbl_ProductCatg
(
   ID INT IDENTITY(1, 1)
   , Code AS RIGHT('000' + CAST(ID AS VARCHAR(4)), 4)
   , Description NVARCHAR(128)
)

您还可以使该列保持不变,这样就不会在每次引用该列时对其进行计算

将列标记为持久化指定数据库引擎将在表中物理存储计算值,并在更新计算列所依赖的任何其他列时更新这些值

您可能想看看

从听起来你正试图做的事情来看,这对你来说很有用

CREATE TABLE tbl_ProductCatg
(
   ID INT IDENTITY(1, 1)
   , Code AS RIGHT('000' + CAST(ID AS VARCHAR(4)), 4)
   , Description NVARCHAR(128)
)

您还可以使该列保持不变,这样就不会在每次引用该列时对其进行计算


将列标记为持久化指定数据库引擎将在表中物理存储计算值,并在更新计算列所依赖的任何其他列时更新这些值

不幸的是,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() 
第二个选项是进一步将其转换为一个在更新和插入时运行的触发器。我一直被教导尽可能避免触发,而是在SP级别执行操作,但在某些情况下触发是合理的


第三个选项是计算字段,如@Adam Wenger所述。不幸的是,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() 
第二个选项是进一步将其转换为一个在更新和插入时运行的触发器。我一直被教导尽可能避免触发,而是在SP级别执行操作,但在某些情况下触发是合理的


第三个选项是计算字段,如@Adam Wenger所述,SQL server的计算列允许保留列。这意味着该值是在Insert上计算的,然后与传统列类似地存储。这消除了对读取进行多个计算的缺点。SQL server的计算列允许保留一个列。这意味着该值是在Insert上计算的,然后与传统列类似地存储。这消除了读取时多次计算的缺点。