0

在在公司,我在現在的工作,他創造了一個表,接受一個int作爲ID領域的全球DBA的infinte智慧,但不自動遞增的數量。自動遞增的SQL值

我從.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 row(s)affected)

(1行(一個或多個)受影響)

(1行(一個或多個)受影響)

(1行(一個或多個)受影響)

(1行(一個或多個)受影響) 消息2627,級別14,狀態1,過程sp_Insert_Supporting_Error_Info,第9行 違反PRIMARY KEY約束'PK_CEQZW'。不能在對象'dbo.CEQZW'中插入重複鍵。重複的鍵值是(1)。 該聲明已被終止。

所以我的問題是如何將我,比錘擊網絡,應用程序和SQL Server自動遞增並添加ID到表

+0

爲什麼不把自己的ERROR_VAR_ID聲明爲autoincrement? –

+0

我很想去,但這裏的DBA並不相信他們,他們喜歡用攪拌器來貼着你的臉,試圖讓他理解東西...... –

+0

不相信他們嗎?你可以告訴他他們存在... :-) –

回答

2

好等,我會轉到你的DBA啓動和問爲什麼他決定不讓ID列和身份。也許他會改變主意。

但是,如果他將繼續這一決定,不要試圖創建你自己的自動遞增機制。
99.9%的案例有可能失敗,特別是在多用戶環境中。
相反,使用標識列中已有的線程安全方法。

因爲我們正在談論的是一個情況下,你不能在你的目標表中直接使用標識列,我會建議使用在2012年版中引入的序列對象的簡單模仿,讓您的汽車增量。

對於這一點,你需要一個理貨(數字)表。如果您的DBA尚未創建一個,請發送他閱讀Jeff Moden的The "Numbers" or "Tally" Table: What it is and how it replaces a loop,然後將其發送給KM。的this SO post創建腳本的答案。 (方法7是我的最愛)

現在,你有一個數字表,添加一個非常簡單的表:

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

然後,創建一個存儲過程,將插入任何數量的行到該表格並返回新創建的值(感謝Martin Smith在this post上的合併技巧!):

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 

You can see the full script in action on rextester.

我把它留給你納入你自己的程序這一點。

+0

真棒謝謝你。 –