R / 005 / 2016-17
我在表中有这个varchar值,我需要添加1到005。
我需要输出 R / 006 / 2016-17 作为下一个条目
如何分割字符串并添加一个字符串。
答案 0 :(得分:3)
您的表格显示了当您未正确规范化数据时可能会有多糟糕。但你可以使用一些字符串操作来做到这一点。我强烈建议你把它分成适当的列,而不是把它们全部挤在一起。
此代码将根据您的样本数据生成所需的输出。
declare @Something varchar(20) = 'R/005/2016-17'
select parsename(replace(@Something, '/', '.'), 3) + '/' + right('000' + convert(varchar(3), convert(int, parsename(replace(@Something, '/', '.'), 2)) + 1), 3) + '/' + parsename(replace(@Something, '/', '.'), 1)
答案 1 :(得分:0)
如果你没有ParseName(),我有一个可能有帮助的TVF。如果您不能使用UDF,逻辑很容易移植到CROSS APPLY
中Declare @YourTable table (ID int,String varchar(max))
Insert Into @YourTable values
(1,'R/005/2016-17'),
(2,'A/119/2016-18')
Update @YourTable
Set String = Pos1+'/'+right('000000'+cast(cast(Pos2 as int)+1 as varchar(25)),len(Pos2))+'/'+Pos3
From @YourTable A
Cross Apply [dbo].[udf-Str-Parse-Row](A.String,'/') B
Select * from @YourTable
更新表
ID String
1 R/006/2016-17
2 A/120/2016-18
UDF如果需要
CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
,Pos6 = xDim.value('/x[6]','varchar(max)')
,Pos7 = xDim.value('/x[7]','varchar(max)')
,Pos8 = xDim.value('/x[8]','varchar(max)')
,Pos9 = xDim.value('/x[9]','varchar(max)')
From (Select Cast('<x>' + Replace(@String,@Delimiter,'</x><x>')+'</x>' as XML) as xDim) A
)
--Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse-Row]('John Cappelletti',' ')
答案 2 :(得分:0)
在为此类型案例创建表时,您可以使用Computed Columns。
例如: -
[EmployeeNo] AS([PreFix] + RIGHT('0000000'+ CAST(Id AS VARCHAR(7)),7))PERSISTED,