Efter mange tanker skrev Arne Vajhøj:
> On 12/14/2012 8:00 PM, Leif Neland wrote:
>> Mssql 2008R2
>>
>> Jeg skal lave nogle "seo-venlige" url'er.
>> Jeg har bl.a. to kolonner, titel, og url.
>> Der er et unikt index på url.
>>
>> Jeg har en funktion to_seo, der fjerner "farlige" tegn.
>>
>> Jeg vil undgå generelt at sætte et nr på, som man ofte ser
>>
http://site.dom/hans_og_grete_12345
>>
>> Kun ved sammenfald kan det accepteres at sætte et tal eller tilfældige
>> tegn efter.
>>
>> Et query son
>> UPDATE tabel SET url=to_seo(titel)
>> vil jo dø, hvis der er sammenfald.
>>
>> Query'et skal køre i databasen, en stored procedure, det vil tage alt
>> for lang tid, hvis der fra applikationen for hver enkelt record skal
>> spørges
>> findes "titel" i db?
>> Hvis ja, findes "titel_1"?
>> Hvis ja, finde "titel_2"
>>
>> Idéer, tak :-)
>
> Hvor stor en andel er der sammenfald på?
Ud af knap 70000 er der 1400 sammenfald
>
> Hvis det er meget få så ville jeg bare lave:
>
> SELECT id,titel FROM tabel
> for each row {
> if failing UPDATE tabel SET url=to_seo(titel) WHERE id=? {
> n = 0
> do {
> n++
> } while failing UPDATE tabel SET url=to_seo(titel)+'_'+n WHERE id=?
> }
> }
>
Øv, jeg troede lige det var en smart og valid syntax i en sp, men jeg
kan søreme ikke google "If failing UPDATE"
Der kunne jo være noget, jeg ikke havde hørt om før.
Jeg tror jeg vil lave noget som
-- giv alle en unik seo-uvenlig url
UPDATE tabel SET url='?prodid='+cast(id as nvarchar(8);
DECLARE @n integer = 0;
DECLARE @pf nvarchar(5) = ''; -- postfix for at gøre url unik
WHILE @n<10 AND EXISTS (SELECT id FROM tabel WHERE url LIKE '?prodid=')
BEGIN
UPDATE tabel SET url=to_seo(titel+@pf)
WHERE NOT EXISTS (SELECT id FROM tabel WHERE url=to_seo(titel));
SET @n=@n+1;
SET @pf='_'+cast(n AS NVARCHAR(4));
END
Det har foreløbig kørt i 5 minutter, og den er sat til at stoppe efter
første løkke...
Men det er jo kun første gang at alle skal "seo'es".
Ellers er det kun det enkelte nye produkt, der skal seo'es; det kan
ikke tage så lang tid...
Leif