簡體   English   中英

自動遞增SQL值

[英]Auto Increment SQL Value

我現在正在一家公司使用全球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的回答上。 這太發布了創建腳本。 (方法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的完整腳本。

我將由您自己決定將其合並到您自己的過程中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM