1

ローカル DB にコピーする必要がある外部サイトにテーブルがありますが、いくつかの変換が必要です。大幅に変更する必要がある列の 1 つは、product_url と呼ばれます。URL の形式は、site.com\category\sub-category\brand\model# です。

私のローカル データベースのテーブルには、このデータを保持するための 4 つの列があります。それらは、カテゴリ、サブカテゴリ、ブランド、およびモデル番号になります。そのため、最初に site.com をトリミングする必要があります (truncate を使用してこれを行いました) が、\category\sub-category\brand\model# を解析する必要があります。

SO から UDF を見つけました。これが役立つと思います。ここにあります:

create function dbo.SplitString 
    (
        @str nvarchar(4000), 
        @separator char(1)
    )
    returns table
    AS
    return (
        with tokens(p, a, b) AS (
            select 
                1, 
                1, 
                charindex(@separator, @str)
            union all
            select
                p + 1, 
                b + 1, 
                charindex(@separator, @str, b + 1)
            from tokens
            where b > 0
        )
        select
            p-1 zeroBasedOccurance,
            substring(
                @str, 
                a, 
                case when b > 0 then b-a ELSE 4000 end) 
            AS s
        from tokens
      )
    GO

現在、この機能の使用に問題があります。おそらくUDFの経験が不足しているためです。

これが私が今持っているものです:

select s from
dbo.SplitString(select substring(product_url, 8, len(product_url)) 
            from Products, '/')
where zeroBasedOccurance=0 AS Category

これは明らかに構文的にも正しくありません。

私はこれが最善の方法であるかどうか疑問に思っています。私はまだ DBA に慣れていないので、この問題に頭を悩ませています。このUDFをproduct_urlテーブルの各行に最大4回適用する方法を理解する必要があります。

4

1 に答える 1

2

あなたの機能についてはわかりませんが、ここに私のものがあります:

CREATE FUNCTION dbo.FN_PARSENAME(@chunk VARCHAR(4000), @delimiter CHAR(1), @index INT )
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE
    @curIndex INT = 0,
    @pos INT = 1,
    @prevPos INT = 0,
    @result VARCHAR(1000)

WHILE @pos > 0
BEGIN

    SET @pos =  CHARINDEX(@delimiter, @chunk, @prevPos);

    IF(@pos > 0)
    BEGIN -- Characters between position and previous position
        SET @result = SUBSTRING(@chunk, @prevPos, @pos-@prevPos)
    END
    ELSE
    BEGIN -- Last Delim
        SET @result = SUBSTRING(@chunk, @prevPos, LEN(@chunk))
    END

    IF(@index = @curIndex)
    BEGIN
        RETURN @result
    END

    SET @prevPos = @pos + 1
    SET @curIndex = @curIndex + 1;
END
RETURN '' -- Else Empty
END

あなたはそれを次のように呼びます:
SELECT Address_Line1 = dbo.fn_Parsename(Merged,'|', 0) FROM Table

ここで、Merged は区切られたフィールドで、'|' は区切り文字なので、'\' にします。0 は文字列の必要な部分であり、0 が最初です。

あなたの例では、次のようになります。

SELECT category = dbo.fn_Parsename(product_url,'\', 1)
     , sub-category = dbo.fn_Parsename(product_url,'\', 2)
     , brand = dbo.fn_Parsename(product_url,'\', 3)
     , model# = dbo.fn_Parsename(product_url,'\', 4)
FROM Table 

または、場合によっては0〜3かもしれません。

おそらくSOでさえ、私が見つけたものからそれを適応させたと確信していますが、誰が信用に値するか思い出せません。

于 2013-05-23T19:35:47.483 に答える