sql - 在 SQL Server 2008 R2 中,是否可以在不使用 IDENTITY(1,1) 的情况下创建自定义自动增量标识字段?
问题描述
我希望能够从表中提取自定义键值,但也希望它能够像 SQL Server 的IDENTITY(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;
- 想过一个标量函数,但函数不能执行存储过程或更新语句以在查找表中设置新的键值。
谢谢
解决方案
您可以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
推荐阅读
- c# - 使用带有 MemoryMappedFile 的 PositionPointer 抛出异常?
- c++ - Atmel Studio:返回一个包含数组的寄存器
- keras - 多类多标签数据的激活函数
- r - 拆分数据框,重新排列并保存为单独的 csv 文件
- django - 为 django 集成前端 js 框架 (Vue)
- flutter - 如何将 Stratless 小部件包含到 StatefulWidget 中?
- django - 重新创建容器时的 Bitbucket 管道 docker 卷权限
- swift - 是否可以在另一个协议的扩展内实现一个协议的功能?
- php - API 平台 - 数据持久化器 - 无法创建新用户
- mysql - 不同条件查询同一张SQL表的多个实例