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?