Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 前缀为usr的自动增量。sql server_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 前缀为usr的自动增量。sql server

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

我无法使用前缀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 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