代码之家  ›  专栏  ›  技术社区  ›  Simon Price

自动增加SQL值

  •  0
  • Simon Price  · 技术社区  · 7 年前

    根据我目前所在公司的全球DBA的英芬特智慧,他创建了一个表,该表将int作为ID字段,但不会自动递增数字。

    这是我的存储过程

    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行受影响)

    Msg 2627,14级,状态1,程序sp\u Insert\u Supporting\u Error\u Info,第9行 声明已终止。

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

    1 回复  |  直到 4 年前
        1
  •  2
  •   Zohar Peled    7 年前

    首先,我要去你们的DBA,问他为什么决定不做ID列和标识。也许他会改变主意。


    99.9%的情况下,它有可能失败,尤其是在多用户环境中。

    由于我们讨论的是一种无法在目标表中直接使用标识列的情况,我建议使用2012版本中引入的序列对象的简单模拟来实现自动增量。

    为此,您需要一个计数(数字)表。如果您的DBA尚未创建一个,请发送给他阅读Jeff Moden的 The "Numbers" or "Tally" Table: What it is and how it replaces a loop this SO post 用于创建脚本。(方法7是我最喜欢的。)

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

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

    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.