我现在正在一家公司中使用全球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会为我带来一些帮助,就像我对此进行测试时一样
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)。该语句已终止。
(影响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上看到完整的脚本。
我将由您自己决定将其合并到您自己的过程中。