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

この機能を使用すると:

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

結果は次のとおりです。


1 10 20

2 1 30

それは本当です

この機能を使用すると:

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

結果は次のとおりです。


1 1、20

2 空 30

それは間違っている

ストアドプロシージャの2番目の呼び出しを修正するには?

4

2 に答える 2

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
于 2012-04-13T08:28:00.140 に答える
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
于 2012-04-13T08:24:09.037 に答える