7
votes

Fonction T-SQL pour générer des limaces?

Vérification rapide Pour voir si quelqu'un a ou connaît une fonction T-SQL capable de générer des limaces à partir d'une entrée nvarcharise donnée. c'est-à-dire

"bonjour monde"> "bonjour-monde"
"Ceci est un test"> "this-is-test"

J'ai une fonction C # que j'utilise normalement à ces fins, mais dans ce cas, j'ai une grande quantité de données pour analyser et transformer en limaces, il est donc plus logique de le faire sur le serveur SQL. plutôt que de devoir transférer des données sur le fil.

Afret, je n'ai pas d'accès à distance de bureau à la boîte, donc je ne peux donc pas exécuter le code (.NET, PowerShell, etc.) contre celui-ci

Merci d'avance.

EDIT: Selon la demande, voici la fonction que j'utilise généralement pour générer des limaces: xxx


1 commentaires

Pouvez-vous publier votre fonction C # Slug-Generator?


7 Réponses :


15
votes

Vous pouvez utiliser inférieur code> et remplacer code> pour faire ceci:

UPDATE myTable
SET slug = REPLACE(LOWER(origString), ' ', '-')


1 commentaires

Pour slugifier correctement une chaîne unicode, vous auriez besoin de beaucoup plus que cela. Au moins tous les caractères non ASCII doivent être traités.



9
votes

C'est ce que j'ai trouvé en solution. N'hésitez pas à corriger / modifier si nécessaire.

Je dois mentionner que la base de données que je développe actuellement est insensible à l'insensibilité de la casse (@str). xxx

mention à: http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-a-PARSE-ALPHANUMERIR-CARACTERS-DROM -String / pour le code d'origine.


1 commentaires

Il ne faut pas être % [^ 0-9a-z]% ' mais devrait être % [^ 0-9a-z-]%'



4
votes

Voici une variante de la réponse de Jeremy. Cela pourrait ne pas être techniquement slugiquer puisque je fais quelques choses personnalisées comme le remplacement "." avec "-dot-" et enlever des apostrophes. L'amélioration principale est celle-ci élimine également tous les espaces consécutifs et ne dépassant pas les tirets préexistants. xxx


1 commentaires

Très utile. Deux choses que j'ai remarquées, ce script ne manipulait pas les entrées (probablement menant?) Les entrées des espaces terminés par une parentale de fermeture ont laissé un trait d'union de fuite. Pour le premier, coupez l'entrée. Pour la seconde, je ne suis pas sûr parce qu'un trait d'union de fuite pourrait être exprès ...



3
votes

J'ai pris la réponse de Jeremy quelques étapes supplémentaires en retirant tous les tirets consécutifs même après que les espaces sont remplacés et supprimé des tirets de tête et de fuite.

create function dbo.Slugify(@str nvarchar(max)) returns nvarchar(max) as
begin
    declare @IncorrectCharLoc int
    set @str = replace(replace(lower(@str),'.','-'),'''','')

    -- remove non alphanumerics:
    set @IncorrectCharLoc = patindex('%[^0-9a-z -]%',@str)
    while @IncorrectCharLoc > 0
    begin
        set @str = stuff(@str,@incorrectCharLoc,1,' ')
        set @IncorrectCharLoc = patindex('%[^0-9a-z -]%',@str)
    end

    -- replace all spaces with dashes
    set @str = replace(@str,' ','-')

    -- remove consecutive dashes:
    while charindex('--',@str) > 0
    begin
        set @str = replace(@str, '--', '-')
    end

    -- remove leading dashes
    while charindex('-', @str) = 1
    begin
        set @str = RIGHT(@str, len(@str) - 1)
    end

    -- remove trailing dashes
    while len(@str) > 0 AND substring(@str, len(@str), 1) = '-'
    begin
        set @str = LEFT(@str, len(@str) - 1)
    end
return @str
end


0 commentaires

0
votes
-- Converts a title such as "This is a Test" to an all lower case string such
-- as "this-is-a-test" for use as the slug in a URL.  All runs of separators
-- (whitespace, underscore, or hyphen) are converted to a single hyphen.
-- This is implemented as a state machine having the following four states:
--
--     0 - initial state
--     1 - in a sequence consisting of valid characters (a-z, A-Z, or 0-9)
--     2 - in a sequence of separators (whitespace, underscore, or hyphen)
--     3 - encountered a character that is neither valid nor a separator
--
-- Once the next state has been determined, the return value string is
-- built based on the transitions from the current state to the next state.
--
-- State 0 skips any initial whitespace.  State 1 includes all valid slug
-- characters.  State 2 converts multiple separators into a single hyphen
-- and skips trailing whitespace.  State 3 skips any punctuation between
-- between characters and, if no additional whitespace is encountered,
-- then the punctuation is not treated as a word separator.
--
CREATE FUNCTION ToSlug(@title AS NVARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @retval AS VARCHAR(MAX) = ''; -- return value
    DECLARE @i AS INT = 1;                -- title index
    DECLARE @c AS CHAR(1);                -- current character
    DECLARE @state AS INT = 0;            -- current state
    DECLARE @nextState AS INT;            -- next state
    DECLARE @tab AS CHAR(1) = CHAR(9);    -- tab
    DECLARE @lf AS CHAR(1) = CHAR(10);    -- line feed
    DECLARE @cr AS CHAR(1) = CHAR(13);    -- carriage return
    DECLARE @separators AS CHAR(8) = '[' + @tab + @lf + @cr + ' _-]';
    DECLARE @validchars AS CHAR(11) = '[a-zA-Z0-9]';

    WHILE (@i <= LEN(@title))
    BEGIN
        SELECT @c = SUBSTRING(@title, @i, 1),

        @nextState = CASE
            WHEN @c LIKE @validchars THEN 1
            WHEN @state = 0 THEN 0
            WHEN @state = 1 THEN CASE
                WHEN @c LIKE @separators THEN 2
                ELSE 3 -- unknown character
                END
            WHEN @state = 2 THEN 2
            WHEN @state = 3 THEN CASE
                WHEN @c LIKE @separators THEN 2
                ELSE 3 -- stay in state 3
                END
            END,

        @retval = @retval + CASE
            WHEN @nextState != 1 THEN ''
            WHEN @state = 0 THEN LOWER(@c)
            WHEN @state = 1 THEN LOWER(@c)
            WHEN @state = 2 THEN '-' + LOWER(@c)
            WHEN @state = 3 THEN LOWER(@c)
            END,

        @state = @nextState,

        @i = @i + 1
    END
    RETURN @retval;
END

1 commentaires

Pourriez-vous ajouter plus de commentaires?



3
votes

Je sais que c'est un vieux fil, mais pour la génération future, j'ai trouvé une fonction qui traite même avec des accents ici : xxx


2 commentaires

Utilisation de Assembler SQL_LATIN1_CENERAL_CP1251_CS_AS Pour les accents des bandes ne fonctionne que avec des variables Varchari. Si vous essayez de faire de même avec la variable Nvarchar, rien ne se passe. Si l'entrée est NvarchaRar, il devra être expliqué explicite en Varcharne à un moment donné à l'aide de Cast (@string comme varchar) . Si vous ne le faites pas, les accents resteront là où ils sont.


En outre, l'utilisation de la distribution avec une longueur spécifique peut être requise car SQL Server semble raccourcir votre chaîne si elle est convertie en varchar à l'intérieur d'un Sélectionnez . Par exemple Cast (@string comme Varchar (500)) .



0
votes
To slug with Vietnamese unicode    

CREATE function [dbo].[toslug](@string nvarchar(4000)) 
    RETURNS varchar(4000) AS BEGIN 
    declare @out nvarchar(4000)
    declare @from nvarchar(255)
    declare @to varchar(255)
    --convert to ASCII dbo.slugify
    set @string = lower(@string)
    set @out = @string
    set @from = N'ýỳỷỹỵáàảãạâấầẩẫậăắằẳẵặéèẻẽẹêếềểễệúùủũụưứừửữựíìỉĩịóòỏõọơớờởỡợôốồổỗộđ·/_,:;'
    set @to = 'yyyyyaaaaaaaaaaaaaaaaaeeeeeeeeeeeuuuuuuuuuuuiiiiioooooooooooooooood------'
    declare @pi int 
    set @pi = 1
    --I'm sorry T-SQL have no regex. Thanks for patindex, MS .. :-)
    while @pi<=len(@from) begin
        set @out = replace(@out, substring(@from,@pi,1), substring(@to,@pi,1))
        set @pi = @pi + 1
    end
    set @out = ltrim(rtrim(@out))

   -- replace space to hyphen   
   set @out = replace(@out, ' ', '-')

   -- remove double hyphen
   while CHARINDEX('--', @out) > 0 set @out = replace(@out, '--', '-')

   return (@out)
END

2 commentaires

Veuillez consulter comment votre message a rendu et Modifiez-le pour réparer le formatage . Vous obtenez un petit aperçu pratique dans la zone post-édition afin que vous puissiez voir à quoi cela va ressembler avant de le soumettre.


Ce lien peut vous être utile - Comment répondre