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" p> blockQuote>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. P>
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 P>
Merci d'avance. P>
EDIT: Selon la demande, voici la fonction que j'utilise généralement pour générer des limaces: p>
xxx pré> p>
7 Réponses :
Vous pouvez utiliser inférieur code> et remplacer code> pour faire ceci:
UPDATE myTable SET slug = REPLACE(LOWER(origString), ' ', '-')
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.
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). p> mention à: http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-a-PARSE-ALPHANUMERIR-CARACTERS-DROM -String / pour le code d'origine. p> p>
Il ne faut pas être % [^ 0-9a-z]% ' code> mais devrait être % [^ 0-9a-z-]%' code>
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.
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 ...
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
-- 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
Pourriez-vous ajouter plus de commentaires?
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 :
Utilisation de Assembler SQL_LATIN1_CENERAL_CP1251_CS_AS CODE> 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) code>. 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 code> à l'intérieur d'un Sélectionnez code>. Par exemple Cast (@string comme Varchar (500)) Code>.
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
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
Pouvez-vous publier votre fonction C # Slug-Generator?