2016-10-21 4 views
0

R/005/2016から17SQL文字列の分割と増分値

私がテーブルに持っているこのvarchar型の値は、私は005

に1を追加する必要がある私は、出力R/006が必要/ 2016-17次のエントリ

どのように文字列を分割して追加することができますか?

+1

何、持続しましたこの3つの値の列を3つの列に変換するだけです。単一の列に複数の値を格納すると1NFに違反し、多くの問題が発生します。あなたがここに直面しているのは、貧弱なテーブルデザインのためです。これが3列の場合、これは簡単です。定義されているように、文字列を分割し、中間の値に1を加え、文字列に戻し、最後にこれを連結して単一の値にする必要があります。 UGH !!! –

+0

私は@SeanLangeと同意します - あなたは 'SUBSTRING(式、開始、長さ)'を使用して列の中で最大値を見つけて1を加えることができますが、大きなデータを持っているならばお勧めできません。 – GauravKP

答えて

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) 
0

ParseName()をお持ちでない場合、私はTVFを持っています。あなたはUDFを使用できない場合は、必要に応じて、ロジックを簡単に更新テーブル

ID String 
1 R/006/2016-17 
2 A/120/2016-18 

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 

UDFを適用CROSSに移植され

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',' ') 
+0

xmlデータ型を使用できる場合は、それらはparsenameを持っています。 SQL Serverに組み込まれています。 –

+0

@SeanLangeあなたは本当ですか? ParseName()が2012 + –

+0

のPARSENAMEが2005年に出てきたのに対し、XMLは2008年にはかなりあると確信しています。私は2005年のインスタンスをダブルチェックしています。それはそこにあります。私はparsenameを2012年よりずっと長く使っています。:)そして2005年はxmlデータ型が来た時です。 –

0

あなたが計算を使用することができますこの型のケースのテーブルを作成するときの列。

例: -

[EmployeeNo]([プレフィックス] + RIGHT( '0000000' + CAST(同上AS VARCHAR(7))、7))AS

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