My Out put like This : If it is North "N00001
N00002
If it is South "S00001
S00002
这是我的试用代码
Declare @Zone varchar(20),@ZoneID int,@id varchar(10)
Set @Zone = 'S'
Select @ZoneID = cast(isnull(max(cast(replace(Idno,@Zone,'') as numeric))+1,'00000') as varchar) from memberprofiles Where left(idno,1) = @Zone
Set @id = @Zone+cast(@ZoneID as varchar)
select @id
但每次我得到“S1”但我需要“S00001”
如何生成区域号码生成
答案 0 :(得分:3)
这个问题是一个“封闭的重复”候选人。但是,由于存在一些缺陷,我认为值得回答:
在您的数据库中,您似乎有一个“Idno”列,其中包含标记该区域的前导字符。如果这是真的,你应该 - 如果可能的话 - 改变设计。数字和区域标记应位于两列中。它们的任何组合都是演示问题
您的LEFT(Idno,1)
表现不佳(阅读“sargability”)。如果Idno上有索引,那么Idno LIKE ' + @Zone + '%'
您确定,在“memberprofiles”中只有一行您的WHERE
子句是真的吗?如果没有,您在SELECT
后的“@ZoneID”中会看到哪个号码?
你的cast(isnull(max(cast(replace(Idno,@Zone,'') as numeric))+1,'00000') ...
没有任何东西取代领先的“S”,希望还剩下一个数字。你会得到最高的数字(好的,这个答案点3,但仍然非常 - 嗯 - hacky),你仍然期望一个“NULL”,你将返回“00000”。这大声呼喊更好的设计: - )
你应该尝试进入“基于集合”的思维,而不是“程序化”思维......
试试这个
CREATE TABLE #memberprofile(Idno VARCHAR(100),OtherColumn VARCHAR(100));
INSERT INTO #memberprofile VALUES('N3','Test North 3'),('S24','Test South 24'),('N14','Test North 14')
DECLARE @Zone VARCHAR(20)='N';
SELECT *
,ZoneCode + REPLACE(STR(Number,5),' ','0') AS YourNewPaddedCode
FROM #memberprofile
CROSS APPLY
(
SELECT LEFT(Idno,1) AS ZoneCode
,CAST(SUBSTRING(Idno,2,1000) AS INT) AS Number
) AS Idno_in_parts
WHERE ZoneCode=@Zone;
GO
--Clean up
--DROP TABLE #memberprofile
结果
Idno OtherColumn ZoneCode Number YourNewPaddedCode
N3 Test North 3 N 3 N00003
N14 Test North 14 N 14 N00014