2015-01-14 6 views
-1

Я хочу разбить строку с использованием запроса T-SQL без создания какой-либо функции или хранимой процедуры.Как разбить String в SQL Server 2008

Например, у меня есть строка, как

"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;" 

Теперь я хочу получить значение для Job Type которое New.

Просьба предложить мне любой способ сделать это.

Заранее спасибо

+2

Посмотрите на '' SUBSTRING' и функций CHARINDEX'.Вы можете использовать первое, чтобы разделить строку на определенную позицию символа, а второе - на поиск строки для ключевого слова. – Dan

ответ

0

Это должно работать, но это будет зависеть от порядка атрибутов:

select substring(@string, charindex('Job Type', @string) + 17, charindex('Proof Number', @string) - 82) 
Я испытал это с другими значениями для «Тип работы» и, кажется, работать очень хорошо. Если порядок ваших атрибутов изменится, эта процедура больше не будет работать, хотя ...

Поцарапайте все это - если значение первого атрибута изменится, которое больше не будет работать ... Следующее должно обрабатывать любые значения размера :

declare @string varchar(max) = '"Attribute "Request Type" value: asdfasdf; Attribute "Job Type" value: ReallyLongString; Attribute "Proof Number" value: BiggerValue; Attribute "Vision Number" value: 534290;"' 

declare @stringToUse varchar(max) = substring(@string, charindex('Job Type', @string), charindex('Proof Number', @string)) 

select @stringToUse 

select charindex('Job Type', @stringToUse) 

select charindex('Proof Number', @stringToUse) 

select substring(@stringToUse, charindex('Job Type', @stringToUse) + 17, charindex('Proof Number', @stringToUse) - 31) 
0

Вы можете сделать это:

GO 

DECLARE @str VARCHAR(MAX); 

SET @str = '"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"'; 

SELECT SUBSTRING(SUBSTRING(@str, CHARINDEX('JOB TYPE', @str) + 17, LEN(@str) - CHARINDEX('JOB TYPE', @str) + 17), 1, CHARINDEX('Attribute', @str) + 1); 

(ИЛИ)

SELECT SUBSTRING(SUBSTRING('"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"',CHARINDEX ('JOB TYPE','"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"')+17,LEN('"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"')-CHARINDEX ('JOB TYPE','"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"')+17),1,CHARINDEX ('Attribute','"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"')+1); 
0

Если вы действительно хотите сделать это в одном запросе, то вы можете использовать следующий КТР подход, но он сильно жёстко, вы можете улучшить его для динамического использования:

DECLARE @List  NVARCHAR(MAX) = N'Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;' 
DECLARE @Delimiter NVARCHAR(255) = N';' 

DECLARE @ll INT = LEN(@List) + 1, @ld INT = LEN(@Delimiter); 

    WITH a AS 
    (
     SELECT 
      [start] = 1, 
      [end] = COALESCE(NULLIF(CHARINDEX(@Delimiter, 
         @List, 1), 0), @ll), 
      [value] = LTRIM(RTRIM(REPLACE(
         SUBSTRING(@List, 1, 
         COALESCE(NULLIF(CHARINDEX(@Delimiter, 
         @List, 1), 0), @ll) - 1) 
         , 'Attribute', ''))) 
     UNION ALL 

     SELECT 
      [start] = CONVERT(INT, [end]) + @ld, 
      [end] = COALESCE(NULLIF(CHARINDEX(@Delimiter, 
         @List, [end] + @ld), 0), @ll), 
      [value] = LTRIM(RTRIM(REPLACE(
        SUBSTRING(@List, [end] + @ld, 
        COALESCE(NULLIF(CHARINDEX(@Delimiter, 
         @List, [end] + @ld), 0), @ll)-[end][email protected]) 
         , 'Attribute', ''))) 
     FROM a 
     WHERE [end] < @ll 
    ) 
    SELECT LTRIM(RTRIM(REPLACE(REPLACE(
      REPLACE([value],'"Job Type"', '') 
      , 'value', ''),':','') 
      )) 
    FROM a 
    WHERE LEN([value]) > 0 AND [value] LIKE '%Job Type%' 
    OPTION (MAXRECURSION 0); 

Но я должен призвать вас использовать UDF для преобразования вашей строки в таблицу, а затем для ее использования. Оригинальная идея взята с Common Table Expression

0

Это будет работать и для других атрибутов, просто изменив оператор where.

Доработка данных в XML:

DECLARE @txt varchar(max) = 
    '"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"' 

SELECT 
    RIGHT(t.c.value('.', 'VARCHAR(2000)'), 
    PATINDEX('%_ :eulav%', REVERSE(t.c.value('.', 'VARCHAR(2000)')))) 
FROM (
    SELECT x = CAST('<t>' + 
     REPLACE(STUFF(REVERSE(STUFF(REVERSE(@txt), 1,2, '')), 1, 1, '; '), 
     '; Attribute ', '</t><t>') + '</t>' AS XML) 
) a 
CROSS APPLY x.nodes('/t') t(c) 
WHERE t.c.value('.', 'VARCHAR(2000)') like '"Job Type"%' 

Результат:

New 
0

Его безопаснее разделить Semi-столбцов, разделенных значения новых строк.

enter image description here

QUERY

DECLARE @STR NVARCHAR(MAX)='"Attribute "Request Type" value: Prior; Attribute "Job Type" value: New; Attribute "Proof Number" value: 1; Attribute "Vision Number" value: 534290;"' 
-- You can pass your desired Attribute to get the value 
DECLARE @ATTRIBUTENAME VARCHAR(100)='Job Type' 

-- Extracts the value after the semi column 
SELECT Ids,RIGHT(Ids,LEN(Ids)-CHARINDEX(':',Ids)) VALUE 
FROM 
( -- Converts the Semi column seperated values to rows 
    SELECT PARSENAME(REPLACE(Split.a.value('.', 'NVARCHAR(MAX)'),'"',''),1) 'Ids' 
    FROM 
    (
     -- Select the string in XML format 
     SELECT CAST ('<M>' + REPLACE(@STR, ';', '</M><M>') + '</M>' AS XML) AS Data   
    ) AS A 
    CROSS APPLY Data.nodes ('/M') AS Split(a) 

)TAB 
WHERE Ids LIKE '%Attribute%' AND Ids LIKE '%'[email protected]+'%'