2013-12-06 8 views
0
DECLARE @S VARCHAR(MAX) = '1#5;2#;3#4' 

DECLARE @x xml = '<r><c>' + 
     REPLACE(REPLACE(@S, '#','</c><c>'),';','</c></r><r><c>') + 
     '</c></r>' 

SELECT x.value('c[1]','int') AS ParentCategoryID, 
x.value('c[2]','int') AS CategoryID 

FROM @x.nodes('/r') x(x) 

Это дает мне значения, как я хочу, в виде таблицы.Извлечение отдельных значений из XML в SQL Server

Это XML генерируется:

<r> 
<c>1</c> 
<c>5</c> 
</r> 
<r> 
<c>2</c> 
<c /> 
</r> 
<r> 
<c>3</c> 
<c>4</c> 
</r> 

Мне нужно извлечь отдельные значения (скажем, во временных переменных), так что я могу использовать их для вставки в таблицах. Спасибо!

+0

Возможно, вы можете использовать курсор для достижения этого? – Milen

+0

Я использую это, вроде как работаю, я думаю. :) SELECT @temp = @ x.value ('(/ r/c) [1]', 'int') – Adi

+0

Я имел в виду наличие курсора для выбора каждой строки в вашем наборе результатов и что-то делать с значениями Row – Milen

ответ

1
--SELECT * FROM [dbo].[Split3] ('1,12,-3 ;4, 5,6;', ',', ';') 

CREATE FUNCTION [dbo].[Split3] (
    @String nvarchar(MAX), 
    @SepColumn nvarchar(1), 
    @SepRow nvarchar(1) 
) 

RETURNS @T TABLE (
    col1 nvarchar(50) 
    ,col2 nvarchar(50) 
    ,col3 nvarchar(50) 
) 

AS 
BEGIN 
    DECLARE @ParseXML xml 

    SET @String = LTRIM(RTRIM(@String)) 

    --Remove last row separator from string 
    IF RIGHT(@String, 1) = @SepRow 
     SET @String = LEFT(@String, LEN(@String)-1); 

    -- Check if a string is a list of numbers 
    IF PATINDEX('%[^-0-9 '[email protected][email protected]+']%',@String) = 0 
    BEGIN 
     SELECT @ParseXML = CONVERT(XML,'<r><c>' + REPLACE(REPLACE(@String,@SepColumn,'</c><c>'),@SepRow,'</c></r><r><c>') + '</c></r>') 

     INSERT @T 
     SELECT 
      NULLIF(LTRIM(RTRIM(T.c.value('./c[1]','varchar(20)'))),'') 
      ,NULLIF(LTRIM(RTRIM(T.c.value('./c[2]','varchar(20)'))),'') 
      ,NULLIF(LTRIM(RTRIM(T.c.value('./c[3]','varchar(20)'))),'') 
     FROM @ParseXML.nodes('//r') T(c); 
    END 

RETURN 

END 
GO 
Смежные вопросы