是否可以有一个基于 Identity 列的具有 PK 的表?
假设我有一个客户表,两个字段对于我们的案例很重要,Id
即 isPK
nvarchar(20)
和SequenceId
which is int
identity(1,1)
。我想要一个存储过程,该过程将具有(除其他外)一个参数@CustomerType
,并根据此参数生成值Id
并将新行插入表中。像这样的东西:
CREATE PROCEDURE createCustomer
@CustomerType int,
@GivenName nvarchar(20),
@Surname nvarchar(20),
@BirthDate date = null
...
AS
BEGIN
SET NOCOUNT ON;
DECLARE @prefix nvarchar(1) = N'x'
IF @CustomerType = 1
BEGIN
SET @prefix = N'P'
END
...
ELSE
BEGIN
SET @prefix = N'x'
END
INSERT INTO [dbo].[Customers]
([Id],
[GivenName],[Surname],[BirthDate])
VALUES
(@prefix + (SequenceId + 1000000),
@GivenName,@Surname,@BirthDate);
SELECT INSERTED.Id AS CustomerId; …
Run Code Online (Sandbox Code Playgroud) 我需要创建一个如下所示的表:
+----+---------+---------+
| Id | Product | Version |
+----+---------+---------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 3 |
| 5 | 2 | 2 |
+----+---------+---------+
Run Code Online (Sandbox Code Playgroud)
哪里ID
是Identity(1,1)
我需要的Version
是自动填充这取决于插入Product
。
SELECT
使用ROW_NUMBER()
with可以达到类似的效果PARTITION
:
SELECT ID, Product,
ROW_NUMBER() OVER(PARTITION BY Product ORDER BY ID) AS Version
FROM Products
Run Code Online (Sandbox Code Playgroud)
我有哪些选择?