当前位置: 首页 > 面试题库 >

自动递增SQL值

濮丰
2023-03-14
问题内容

我现在正在一家公司中使用全球DBA的无限智慧,他创建了一个表,该表将一个int用作ID字段,但是不会自动递增该数字。

我要从.Net传递一个表值参数,因为它随时有大约100或更多行的数据正在传递,并且我不想杀死该应用程序,破坏网络或SQL Server。

这是我的存储过程

CREATE PROCEDURE sp_Insert_Supporting_Error_Info

(@tvp [dbo].udt_CEQZW READONLY)

as
begin

INSERT INTO CEQZW 
ERROR_VAR_ID, 
ERROR_ID, 
ERROR_VAR_TYPE_CD, 
ERROR_VAR_VALUE) 
SELECT (SELECT coalesce(MAX(ERROR_VAR_ID), 0) + row_number() over (order by 
(select NULL)) FROM CEQZW) as ERROR_VAR_ID, 
ERROR_ID, 
ERROR_VAR_TYPE_CD, 
ERROR_VAR_VALUE FROM @TVP
end
go

我希望这SELECT coalesce(MAX(ERROR_VAR_ID), 0) + row_number() over (order by (select NULL)) FROM CEQZW会为我带来一些帮助,就像我对此进行测试时一样

declare @p3 dbo.udt_CEQZW
insert into @p3 values(1,N'es',N'test')
insert into @p3 values(1,N'ec',N'test')
insert into @p3 values(1,N'ec',N'test')
insert into @p3 values(1,N'ses',N'test')
insert into @p3 values(1,N'es',N'test')

exec sp_Insert_Supporting_Error_Info @p3

这就是我回来的

(影响1行)

(影响1行)

(影响1行)

(影响1行)

(受影响的1行)消息2627,级别14,状态1,过程sp_Insert_Supporting_Error_Info,第9行违反了主键约束’PK_CEQZW’。无法在对象“
dbo.CEQZW”中插入重复的密钥。重复的键值为(1)。该语句已终止。

因此,我的问题是,除了锤击网络,应用程序和SQL Server自动递增并将ID添加到表中之外,我将如何做?


问题答案:

好吧,我将从您的数据库管理员开始,并问他为什么决定不提供ID列和标识。也许他会改变主意。

但是,如果他保留此决定,请不要尝试自行创建自动递增机制。
在99.9%的情况下,它有可能发生故障,尤其是在多用户环境中。
而是使用Identity列的已内置线程安全方法。

由于我们正在谈论的情况是您不能在目标表中直接使用标识列,因此建议您使用2012年版本中引入的序列对象的简单模拟来获得自动增量。

为此,您需要一个理货(数字)表。如果你的DBA尚未创建一个,送他读杰夫MODEN是在“数字”或“理货”表:它是什么和它如何取代一个循环,然后送他去KM的回答上。这个SO后的创建脚本。(方法7是我的最爱。)

现在您有了一个数字表,您将添加一个非常简单的表:

CREATE TABLE tblSequence
(
    Value int identity(1,1)
)

然后,您创建一个存储过程,将插入任意数量的行到该表,并返回新创造的价值(感谢马丁·史密斯对合并招这个职位):

CREATE PROCEDURE stp_GetNextValues
(
    @NumberOfValues as int
)
AS

    MERGE INTO Sequence
    USING (SELECT Number
           FROM   Tally
           WHERE  Number <= @NumberOfValues) T
    ON 1 = 0
    WHEN NOT MATCHED THEN
      INSERT
      DEFAULT VALUES
    OUTPUT INSERTED.Value;

GO

然后,无论何时执行此存储过程,您都将获得安全的自动递增值。

EXEC stp_GetNextValues 125

您可以在rextester上看到完整的脚本。

我将由您自己决定将其合并到您自己的过程中。



 类似资料:
  • 问题内容: 我正在尝试运行查询以检查列是否自动增加。我可以检查类型,默认值,是否可以为空等,但是我不知道如何测试它是否自动递增。这是我测试其他内容的方式: 不幸的是,没有可比较的列。那么,如何测试列是否自动递增? 问题答案: 对于MySql,请检查以下列: 对于Sql Server,请使用和列:

  • 问题内容: 我的架构看起来像这样: 我已经在同一数据库中创建了counters集合,并添加了一个带有’entityId’的_id的页面。从这里我不确定如何使用猫鼬来更新该页面并获取递增编号。 没有计数器的架构,我希望它保持这种状态,因为这实际上不是应用程序使用的实体。仅应在模式中使用它来自动递增字段。 问题答案: 这是一个示例,如何在Mongoose中实现自动增量字段:

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为。(如果使用包装器) 在某些情况下,该策略被解析为或,因此你可能需要手动将其设置为(取决于基础数据库)。 似乎+ 指定序列名称对你有用。

  • 问题内容: 使用MySQL(特别是5.0)有没有办法让auto_increment字段的值基于分组列? 例: 我不想通过任何“疯狂”的方法来达到这个目的,但是如果需要的话。 问题答案: 对于MyISAM和BDB表,您可以将auto_increment字段作为键的次要部分,例如 这是手册对此所说的 在这种情况下,将为AUTO_INCREMENT列生成的值计算为MAX(auto_increment_c

  • 我在下面的代码中创建了一个表: 此外,我有记录从csv文件导入到表。我想插入一个新的记录到表我一直得到这个错误 错误:重复的键值违反了唯一约束"salesorderdetail_pkey"DETAIL: Key(SalesorderDetid)=(2)已经存在。********** 错误 ********** 错误:重复的键值违反唯一约束“salesorderdetail_pkey”SQL状态:2