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에 전달하는 더 깨끗한 방법 중 하나입니다. –

+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 

그런 다음 당신의 휴식이 무엇이든에 이름을 = 변경 @t, @y, @z에 대해이 과정을 반복합니다.

+0

안녕하세요 Michael 솔루션에 감사드립니다. 입력 문자열에서 마지막 매개 변수는 | 예 : '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 

이 반환 : 길이가 초기 쿼리의 CHARINDEX을 addedfrom되는

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

하는 것으로하는 것은 동일하다 즉 당신이 절대적으로 당신이 이와 비슷한 일을 시도 할 수 있습니다해야하는 경우 말했다되고 검색 문자열 우리는 = 기호 과거 인덱스를 이동하려면 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가하는 이유 사방 인)에서 오는 모든 다듬을 같은데요.