SQL字符串拆分和值增量

时间:2016-10-21 16:03:34

标签: sql sql-server

R / 005 / 2016-17

我在表中有这个varchar值,我需要添加1到005。

我需要输出 R / 006 / 2016-17 作为下一个条目

如何分割字符串并添加一个字符串。

3 个答案:

答案 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,

https://msdn.microsoft.com/en-us/library/ms188300.aspx