3

Webguys は、製品の名前に基づいて一意の URL を望んでいます。同じ名前の製品が他にもある場合は、名前の後に番号を追加します。

our.dom/red-sock

our.dom/red-sock-1

すべての製品に製品 ID や別の番号を付ける必要はありません。つまり、

our.dom/red-sock-123481354

これを seourl と呼ぶフィールドに保存します。

新しい製品を作成するときにそれを取り上げました。トリガーはソウルを追加しようとします。既に存在する場合は、一意の値が見つかるまで番号を増やします。

しかし、テーブル全体に新しいソウルを与える必要があります。もし私がちょうど

update tab set seourl=dbo.createurl(title)

必ず衝突が発生し、操作がロールバックされます。機能する更新をコミットし、残りを変更しないようにするステートメントを作成する方法はありますか?

それとも、RBAR、Row By Agonizing Row 操作をループで実行する必要がありますか?

4

2 に答える 2

0

これをニーズに合わせて調整します。

select
*
from (values('aaa'), ('aaa-12'), ('aaa-'), ('bbb-3')) as src (x)
cross apply (
    select isnull(nullif(patindex('%-[0-9]%', x) - 1, -1), LEN(x))
) as p(idx)
cross apply (
    select
        SUBSTRING(x, 1, idx)
        , SUBSTRING(x, idx + 1, LEN(x) - idx)
) as t(t, xx)
于 2013-06-11T12:17:44.107 に答える
0

これを試して:

declare @tmp table (
    id int not null identity
    , name varchar(100) -- you need name to be indexed
    , urlSuffix int -- store the number (ot you'll have to use PATINDEX, etc. as previously shown)!
    , url as name + ISNULL('_' + cast(NULLIF(urlSuffix, 0) as varchar(100)), '')

    , unique (name, id) -- (trick) index on name
)

insert @tmp (name, urlSuffix)
select
    src.name
    , ISNULL(T.urlSuffix, -1) + ROW_NUMBER() OVER (PARTITION BY src.name ORDER BY (select 1))
from (values
    ('x')
    , ('y')
    , ('y')
    , ('y')
    , ('z')
    , ('z')
) as src (name)
left join (
    select
        name
        , MAX(T.urlSuffix) as urlSuffix
    from @tmp AS T
    GROUP BY name
) as T on (
    T.name = src.name
)

insert @tmp (name, urlSuffix)
select
    src.name
    , ISNULL(T.urlSuffix, -1) + ROW_NUMBER() OVER (PARTITION BY src.name ORDER BY (select 1))
from (values
    ('a')
    , ('b')
    , ('b')
    , ('b')
    , ('z')
    , ('z')
) as src (name)
left join (
    select
        name
        , MAX(T.urlSuffix) as urlSuffix
    from @tmp AS T
    GROUP BY name
) as T on (
    T.name = src.name
)

select
    name, url
from @tmp
order by url

あなたの問題の解決策は ROW_NUMBER() の使用にあるべきです

于 2013-06-13T07:21:24.580 に答える