1

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

入力文字列には、次のようにパイプライン区切り文字で区切られた変数名とその値が含まれます。

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

ストアドプロシージャで、@x, @y, @z, @t値を取得する ような変数を宣言しました。

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

また、入力文字列は、次のような任意の順序で値を持つことができます。

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

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

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

4

4 に答える 4

5

考えられる解決策の 1 つは、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)
于 2012-04-05T20:01:53.747 に答える
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 があちこちでそれを行う理由です)。

于 2012-04-05T20:24:37.130 に答える
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、検索文字列と等しいことに注意してください。

"Name=" は 5 文字に等しいので、インデックスを = 記号を超えて移動するために 5 を追加します。"Mobile=" は 7 に等しいので、7 を追加します。

同様に、最後のSELECTクエリでは、それぞれCHARINDEXから 1 を引いて | を削除しています。シンボル。

ソース:

サブストリング

チャリデックス

Lトリム

Rトリム

于 2012-04-05T19:20:43.447 に答える
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 に対してこれを繰り返すだけで、Name= をブレークに変更します。

于 2012-04-05T19:09:34.740 に答える