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:
<r>
<c>1</c>
<c>5</c>
</r>
<r>
<c>2</c>
<c />
</r>
<r>
<c>3</c>
<c>4</c>
</r>
我需要提取单个值(例如,在临时变量中),以便我可以使用它们插入表中。 谢谢!
答案 0 :(得分: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 '+@SepColumn+@SepRow+']%',@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