首页 > 解决方案 > 在 SQL Server 2008 R2 中,是否可以在不使用 IDENTITY(1,1) 的情况下创建自定义自动增量标识字段?

问题描述

我希望能够从表中提取自定义键值,但也希望它能够像 SQL Server 的IDENTITY(1,1)插入列一样执行。

自定义键用于另一个应用程序,需要由不同的功能使用,因此需要从表中提取值并用于其他区域。

以下是我的一些尝试:

  1. 尝试在表上使用触发器在单次插入时效果很好,在使用 SQL 插入时失败(忘记触发器不是按行而是按批处理的事实)
ALTER TRIGGER [sales].[trg_NextInvoiceDocNo] 
ON [sales].[Invoice]
AFTER INSERT 
AS
BEGIN
    DECLARE @ResultVar VARCHAR(25)
    DECLARE @Key VARCHAR(25)

    EXEC [dbo].[usp_GetNextKeyCounterChar] 
               @tcForTbl = 'docNbr', @tcForGrp = 'docNbr', @NewKey =      @ResultVar OUTPUT

    UPDATE sales.InvoiceRET
    SET DocNbr = @ResultVar
    FROM sales.InvoiceRET
    JOIN inserted ON inserted.id = sales.InvoiceRET.id;
END;
  1. 想过一个标量函数,但函数不能执行存储过程或更新语句以在查找表中设置新的键值。

谢谢

标签: sqltsqlsql-server-2008-r2auto-increment

解决方案


您可以ROW_NUMBER()根据要处理的并发类型来使用。这是一些示例数据和可以在本地运行的演示。

-- Sample table
USE tempdb
GO
IF OBJECT_ID('dbo.sometable','U') IS NOT NULL DROP TABLE dbo.sometable;
GO
CREATE TABLE dbo.sometable
(
  SomeId INT NULL,
  Col1   INT NOT NULL
);
GO

-- Stored Proc to insert data
CREATE PROC dbo.InsertProc @output BIT AS
BEGIN -- Your proc starts here
  INSERT dbo.sometable(Col1) 
  SELECT datasource.[value]
  FROM   (VALUES(CHECKSUM(NEWID())%100)) AS datasource([value]) -- simulating data from somewhere
  CROSS APPLY (VALUES(1),(1),(1)) AS x(x);

  WITH 
  id(MaxId) AS (SELECT ISNULL(MAX(t.SomeId),0) FROM dbo.sometable AS t),
  xx AS 
  (
    SELECT     s.SomeId, RN = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))+id.MaxId, s.Col1, id.MaxId
    FROM       id     AS id
    CROSS JOIN dbo.sometable AS s
    WHERE      s.SomeId IS NULL
  )
  UPDATE xx SET xx.SomeId = xx.RN;

  IF @output = 1
  SELECT t.* FROM dbo.sometable AS t;
END
GO 

每次我运行时:EXEC dbo.InsertProc 1;它会返回 3 行以上正确的 ID col。每次我执行它时,它都会根据需要添加更多行和自动增量。

SomeId   Col1
-------- ------
1        62
2        73
3        -17

推荐阅读