1

入力が文字列であるストアドプロシージャを記述する必要があります。文字列を解析するストアドプロシージャ

入力文字列が、このようなパイプラインの区切り文字で区切られた変数名とその値が含まれています。私も

@x=Praveen (Name value) 
@y=Hyderabad (City Value) 
@z=48629387429(Mobile Value) 
@t=User(Role Value) 

入力として値を得るために@x, @y, @z, @tような変数を宣言したストアドプロシージャで

Name =Praveen | City=Hyderabad | Mobile=48629387429| Role=User| etc 

を文字列は任意の順序で値を持つことができます。

City=Hyderabad | Mobile=48629387429 | Role=User | Name =Praveen |etc 

@x, @y, @z, @tなどに値を解析したら、これらの値をストアドプロシージャで使用する必要があります。

入力文字列を解析してName, City, Mobile, Roleの値を@x, @y, @zに、@tにそれぞれ変換する方法を教えてください。

+0

1の代わりに4つのパラメータを使うともっと簡単になります – Soader03

+0

CHARINDEX、SUBSTRINGなどの関数を使用して文字列を解析しようとしましたが、ロジックを解明できませんでした。 – user1316031

答えて

4

つのPOS使用可能な解法はXMLを使用する

DECLARE @text VARCHAR(1000) 
     ,@xml xml 

SELECT @text = 'City=Hyderabad | Mobile=48629387429 | Role=User | Name =Praveen' 

SELECT @text = REPLACE(@text,'|','"') 
    ,@text = REPLACE(@text,'=','="') 
    ,@text = '<row ' + @text + '"/>' 

SELECT @xml = CAST(@text AS XML) 

select 
    line.col.value('@Name[1]', 'varchar(100)') AS Name 
    ,line.col.value('@City[1]', 'varchar(100)') AS City 
    ,line.col.value('@Mobile[1]', 'varchar(100)') AS Mobile 
    ,line.col.value('@Role[1]', 'varchar(100)') AS Role 
FROM @xml.nodes('/row') AS line(col) 
+1

+1。 XMLは、一連のキー/値ペアをSQL Serverに渡す、よりクリーンな方法の1つです。 –

+0

XMLをサポートするリレーショナルデータベースで誰もがXMLに変換するのはなぜですか? –

+3

私にとっては、理想的には、リレーショナルデータベースが強制されるべきではないことに対して、それはかなり簡単な解決策です。 –

0

あなたの入力パラメータが@Textとしましょう。

DECLARE @Text varchar(255), 
    @x varchar(255) 

SET @Text = 'Name=Praveen | City=Hyderabad | Mobile=48629387429| Role=User' 

-- Added to show how to account for non-trailing | 
SET @Text = @Text + ' | '; 

SET @x = LTRIM(RTRIM(substring(
     @Text, 
     charindex('Name=', @Text) + LEN('Name='), 
     charindex(' | ', @Text, charindex('Name=', @Text)) - LEN('Name=') 
     ))) 

SELECT @x 

次に、@y、@z、@t change Name =あなたのブレークが何であれ、これを繰り返してください。

+0

こんにちはマイケルあなたのソリューションのおかげで入力文字列では、最後のパラメータは|例: 'Name = Praveen |都市=ハイデラバード|モバイル= 48629387429 | Role = User 'この場合、コードは最後のパラメータで失敗します。 |文字列の最後の変数を区切ります。これをどうすれば処理できますか? – user1316031

+0

更新されました。 –

0

データ側ではなく、プログラム側で文字列解析を行うことをお勧めします。

DECLARE @String [nvarchar](256) = 'Name=Praveen | City=Hyderabad | Mobile=48629387429 | Role=User |' 

DECLARE @name [nvarchar](256) = (SELECT SUBSTRING(@String, CHARINDEX('Name=', @String)+5, CHARINDEX('|', @String))) 

DECLARE @city [nvarchar](256) = (SELECT SUBSTRING(@String, CHARINDEX('City=', @String)+5, CHARINDEX('|', @String))) 

DECLARE @mobile [nvarchar](256) = (SELECT SUBSTRING(@String, CHARINDEX('Mobile=', @String)+7, CHARINDEX('|', @String))) 

DECLARE @role [nvarchar](256) = (SELECT SUBSTRING(@String, CHARINDEX('Role=', @String)+5, CHARINDEX('|', @String))) 

SELECT RTRIM(LTRIM(LEFT(@name, CHARINDEX('|', @name)-1))) AS Name, 
     RTRIM(LTRIM(LEFT(@city, CHARINDEX('|', @city)-1))) AS City, 
     RTRIM(LTRIM(LEFT(@mobile, CHARINDEX('|', @mobile)-1))) AS Mobile, 
     RTRIM(LTRIM(LEFT(@role, CHARINDEX('|', @role)-1))) AS Role 

これが返されます:

Name | City  | Mobile  | Role 
________________________________________________ 
Praveen | Hyderabad | 48629387429 | User 

注意長さは、初期クエリでCHARINDEXが等しいaddedfromていることそれは、あなたは絶対にあなたがこれに似た何かを試すことができなければならない場合には、言われています検索文字列。

「名前=」5つの文字に等しい。我々は=符号過ぎ指標を移動させるために5を追加するので、 は「モバイル=」7と同じであるので、我々は終了SELECTに同様7.

を追加クエリを削除するには、それぞれCHARINDEXから1を引いています。シンボル。

出典:

SUBSTRING

CHARINDEX

LEFT

LTRIM

RTRIM

+0

こんにちはjon3laze、ありがとうございました!入力文字列では、最後のパラメータは|で終わらない例: 'Name = Praveen |都市=ハイデラバード|モバイル= 48629387429 | Role = User 'この場合、コードは最後のパラメータで失敗します。 |文字列の最後の変数を区切ります。これをどうすれば処理できますか? – user1316031

0

ここでは、文字列操作にループを使用する楽しい方法があります。特定の値を取得するために@x、@yなどの変数を定義する方法に注意してください。

-- Simulate proc parameter 
declare @input nvarchar(max) = 'Name =Praveen | City=Hyderabad | Mobile=48629387429| Role=User' 

-- OP's preferred destination vars 
declare @x nvarchar(max) = 'Name' 
declare @y nvarchar(max) = 'City' 
declare @z nvarchar(max) = 'Mobile' 
declare @t nvarchar(max) = 'Role' 

-- The key/value delimiters we are expecting 
declare @recordDelim nchar(1) = '|' 
declare @valueDelim nchar(1) = '=' 

-- Temp storage 
declare @inputTable table (
     name nvarchar(128) not null primary key 
    , value nvarchar(max) null 
) 

-- Get all key/value pairs 
while ltrim(rtrim(@input)) != '' begin 
    insert into @inputTable (name) select ltrim(rtrim(replace(left(@input, isnull(nullif(charindex(@recordDelim, @input), 0), len(@input))), @recordDelim, ''))) 
    select @input = ltrim(rtrim(right(@input, len(@input) - isnull(nullif(charindex(@recordDelim, @input), 0), len(@input))))) 
end 

-- Separate keys and values 
update @inputTable 
set name = ltrim(rtrim(left(name, isnull(nullif(charindex(@valueDelim, name) - 1, 0), len(name))))) 
    , value = ltrim(rtrim(right(name, len(name) - isnull(nullif(charindex(@valueDelim, name), 0), len(name))))) 

-- Populate the variables 
-- If any are null, then this key/value wasn't present 
set @x = (select value from @inputTable where name = @x) 
set @y = (select value from @inputTable where name = @y) 
set @z = (select value from @inputTable where name = @z) 
set @t = (select value from @inputTable where name = @t) 

はまた、あなたの入力中に不規則な間隔から、私はあなたが(このprocはあちこちことない理由です)入ってくるすべてのものをトリミングしたい推測しています。