Sql server 前缀为usr的自动增量。sql server
我无法使用前缀usr生成自动递增数字。比如 usr001 usr002 需要帮助吗Sql server 前缀为usr的自动增量。sql server,sql-server,stored-procedures,Sql Server,Stored Procedures,我无法使用前缀usr生成自动递增数字。比如 usr001 usr002 需要帮助吗 create procedure USP_PatientAdd @patientID varchar(max), @patientName varchar(max), @patientAge varchar(max), @patientSex varchar(max), @patientFather varchar(max), @patientAddr varchar(max), @patientNumber v
create procedure USP_PatientAdd
@patientID varchar(max),
@patientName varchar(max),
@patientAge varchar(max),
@patientSex varchar(max),
@patientFather varchar(max),
@patientAddr varchar(max),
@patientNumber varchar(max)
as
insert into PTN_DTL(
PTN_DTL_ID,
PTN_DTL_NAME,
PTN_DTL_AGE,
PTN_DTL_SEX,
PTN_DTL_FATHER,
PTN_DTL_ADDR,
PTN_DTL_NU
)
values (
'USR' + RIGHT('000000'+CAST((Select MAX() + 1 as varchar(6)),6),
@patientName,
@patientAge,
@patientSex,
@patientFather,
@patientAddr,
@patientNumber
)
end
没有理由将此字符串存储在任何位置,因为每一行的前缀都是相同的。只需使用
IDENTITY
列,并在查询时或视图中计算USR000…
前缀,等等
CREATE TABLE dbo.foo(id INT IDENTITY(1,1));
GO
INSERT dbo.foo DEFAULT VALUES;
GO 3
SELECT 'USR' + RIGHT('000000' + CONVERT(VARCHAR(6), id), 6), id FROM dbo.foo;
GO
CREATE VIEW dbo.view_foo
AS
SELECT foo_id = 'USR' + RIGHT('000000' + CONVERT(VARCHAR(6), id), 6), id
FROM dbo.foo;
GO
SELECT foo_id, id FROM dbo.view_foo;
GO
如果您确实希望存储此值(尽管我不知道为什么需要,因为USR000…
将位于每一行上,因此意义不大,只会浪费空间),您可以添加一个持久计算列:
ALTER TABLE dbo.foo ADD foo_id AS CONVERT(CHAR(9),
'USR' + RIGHT('000000' + CONVERT(VARCHAR(6), id), 6)) PERSISTED;
标识列将是一个整数。所以它永远不会是“000x”,更不用说“USR000x”
如果您真的想让USR卡在它的前面,我想您可以有一个列(在生成标识值后必须更新该列)将这些值连接在一起。或者,正如Aaron所建议的,在运行时计算它,在视图中,等等。但这仍然不能给出前导零。为什么?只需使用标识列并在查询时计算
'USR0000x'
。在表格的每一行中存储USR0000
除了浪费空间之外还有什么作用?对不起。。我无法理解你的意思@Aaron Bertrand。。它不是标识列。不是varchar(20),我说的是使用标识列。为什么这是一个varchar(20)我不知道。如果前缀总是相同的,你不需要存储前缀。当您想显示id列时,只需在select语句中将前缀与标识列连接起来。此外,您最好设置一个警报,以防标识列接近999999