2012-04-13 4 views
1

내가 가진 SplitDictionary 기능 :분할 문자열

ALTER FUNCTION [dbo].[SplitDictionary] 
( 
    @RowKey NVARCHAR(MAX), 
    @RowData NVARCHAR(MAX), 
    @Delimeter NVARCHAR(2) 
) 
RETURNS @RtnValue TABLE 
(
    ID INT IDENTITY(1,1), 
    keyValue nvarchar(max), 
    Data NVARCHAR(MAX) 
) 
AS 
BEGIN 
    DECLARE @Iterator INT 
    SET @Iterator = 1 

    DECLARE @FoundIndex INT 
    SET @FoundIndex = CHARINDEX(@Delimeter,@RowData) 
    declare @keyFoundIndex int 
    set @keyFoundIndex=charindex(@Delimeter, @RowKey) 


    WHILE (@FoundIndex>0) 
    BEGIN 
     INSERT INTO @RtnValue (keyValue, data) 
     SELECT KeyValue=LTRIM(RTRIM(SUBSTRING(@RowKey, 1, @FoundIndex - 1))), 
      Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1))) 


     SET @RowKey=substring(@RowKey, @FoundIndex + datalength(@Delimeter)/2, len(@RowKey)) 


     SET @RowData = SUBSTRING(@RowData,@FoundIndex + DATALENGTH(@Delimeter)/2,LEN(@RowData)) 

     SET @Iterator = @Iterator + 1 
     SET @FoundIndex = CHARINDEX(@Delimeter, @RowData) 
    END 

    INSERT INTO @RtnValue (keyValue, Data) 
    SELECT keyValue=ltrim(rtrim(@RowKey)), Data = LTRIM(RTRIM(@RowData)) 

    RETURN 
END 

I이 기능을 사용하는 경우 :

SELECT ID, keyValue, Data from dbo.SplitDictionary('10,1','20,30', ',') 

결과이다


1 10 20

그건 사실이야

나는이 기능을 사용하는 경우 :

SELECT ID, keyValue, Data from dbo.SplitDictionary('1,1','20,30', ',') 

결과는 다음과 같습니다


1 일, 20

2 empthy 30

허위입니다

저장 프로 시저에서 두 번째 호출을 수정하는 방법은 무엇입니까?

답변

0

이 작동합니다, 그것을 시도 :

ALTER FUNCTION [dbo].[SplitDictionary] 
( 
    @RowKey NVARCHAR(MAX), 
    @RowData NVARCHAR(MAX), 
    @Delimeter NVARCHAR(2) 
) 
RETURNS @RtnValue TABLE 
(
    ID INT IDENTITY(1,1), 
    keyValue nvarchar(max), 
    Data NVARCHAR(MAX) 
) 
AS 
BEGIN 
    DECLARE @Iterator INT 
    SET @Iterator = 1 

    DECLARE @FoundIndex INT 
    SET @FoundIndex = CHARINDEX(@Delimeter,@RowData) 
    declare @keyFoundIndex int 
    set @keyFoundIndex=charindex(@Delimeter, @RowKey) 


    WHILE (@FoundIndex>0) 
    BEGIN 
     INSERT INTO @RtnValue (keyValue, Data) 
     SELECT KeyValue=LTRIM(RTRIM(SUBSTRING(@RowKey, 1, @keyFoundIndex - 1))), 
      Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1))) 


     SET @RowKey=substring(@RowKey, @keyFoundIndex + datalength(@Delimeter)/2, len(@RowKey)) 


     SET @RowData = SUBSTRING(@RowData,@FoundIndex + DATALENGTH(@Delimeter)/2,LEN(@RowData)) 

     SET @Iterator = @Iterator + 1 
     SET @FoundIndex = CHARINDEX(@Delimeter, @RowData) 
     SET @keyFoundIndex = CHARINDEX(@Delimeter, @RowKey) 
    END 

    INSERT INTO @RtnValue (keyValue, Data) 
    SELECT keyValue=ltrim(rtrim(@RowKey)), Data = LTRIM(RTRIM(@RowData)) 

    RETURN 
END 
0

varchar가이 패턴에 따라 있도록 입력 내용을 변경할 수 있습니다 경우

:

'key[0],value[1]:key[1],value[1]:...key[n]:value[n]' 

이처럼 varchar를 떠나

'10,20:1,30' 

다음이 분할 함수가 주어진 경우 :

CREATE FUNCTION dbo.Split (@s varchar(512),@sep char(1)) 
RETURNS table 
AS 
RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT pn, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s 
    FROM Pieces 
) 
GO 

SQL 쿼리는 매우 간단합니다. 좋아요 :

DECLARE @varcharToSplit VARCHAR(512) 
SET @varcharToSplit='10,20:1,30' 
SELECT 
    pvt.RowIndex, 
    pvt.[1] AS [Key], 
    pvt.[2] AS Value 
FROM 
(
    SELECT 
     SplitColumns.pn AS ColumnIndex, 
     SplitColumns.s AS ColumnValue, 
     SplitRows.pn AS RowIndex 
    FROM 
     dbo.Split(@varcharToSplit,':') AS SplitRows 
     CROSS APPLY dbo.Split(SplitRows.s,',') AS SplitColumns 
) AS SourceTable 
PIVOT 
(
    MAX(ColumnValue) 
    FOR ColumnIndex IN ([1],[2]) 
) AS pvt 
+0

아이디어보다, 나는 그것을 사용합니다 ... – loviji