Преобразовать расширение ToUrlString в T-SQL - PullRequest
1 голос
/ 19 апреля 2019

Мне нужно создать отчет обо всех наших товарах с URL-ссылкой на веб-страницу, которая создается для каждого товара.Веб-сайт использует расширение .ToUrlString (http://www.extensionmethod.net/1935/csharp/string/tourlstring) для генерации адреса ссылки. Есть ли способ получить тот же результат в SQL? База данных SqlServer 2008R2.

Это код длярасширение:

public static string ToUrlString(this string str) {
    if (String.IsNullOrEmpty(str)) return "";
    // Unicode Character Handling: http://blogs.msdn.com/b/michkap/archive/2007/05/14/2629747.aspx
    string stFormD = str.Trim().ToLowerInvariant().Normalize(NormalizationForm.FormD);
    var sb = new StringBuilder();
    foreach (char t in
       from t in stFormD
       let uc = CharUnicodeInfo.GetUnicodeCategory(t)
       where uc != UnicodeCategory.NonSpacingMark
       select t) {
       sb.Append(t);
    }
    return Regex.Replace(sb.ToString().Normalize(NormalizationForm.FormC), "[\\W\\s]{1,}", "-").Trim('-');
 }

Эта функция превращает «Чашки и блюдца» в «чашки-блюдца», а «Набор длинных палочек в форме ложки из 4» в «Ложку-длинный-палочки-из-4»

РЕДАКТИРОВАТЬ: Поскольку это было 2 часа ночи, я устал, и был почти уверен, что я не собираюсь успешно учить себя чему-то новому в то время, я создал длинное выражение REPLACE (), чтобы отфильтровать то, чтоМне нужно. Это ниже в отдельном ответе для любого, кто решает, что он хочет сделать это трудным путем ...

Правильный способ - создать функцию CLR, как предложено @DaleBurrell в комментариях.Статья объясняет это шаг за шагом: Функции SQL CLR:

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

ОБНОВЛЕНО НА 20190424 НА ОСНОВЕ КОММЕНТАРИЙ OP НИЖЕ

Это просто, как пирог с использованием T-SQL.Используя PatReplace8K и функцию, которую я только что написал, чтобы удалить повторяющиеся экземпляры определенного символа (RemoveDupes8K), вы можете сделать следующее:

DECLARE @string VARCHAR(1000) = 'Spoon-Style Long Sticks-Set of 4'

SELECT      newstring = LOWER(r.NewString)
FROM        dbo.patreplace8k(REPLACE(@string,'-',''),'[^a-zA-Z0-9]','-') AS f
CROSS APPLY dbo.RemoveDupes8K(f.NewString,'-') AS r;

Возвращает: spoonstyle-long-sticksset-of-4

Вот что происходит.PatReplace8k берет входную строку (@string) и заменяет все не алфавитно-цифровые символы дефисом.RemoveDupes8K берет эту новую строку и заменяет дублирующиеся дефисы одним.

Вот функции:

CREATE FUNCTION dbo.RemoveDupes8K
(
  @string VARCHAR(8000),
  @char   CHAR(1)
)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
SELECT NewString = 
  REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(@string)),
  REPLICATE(@char,33),@char),
  REPLICATE(@char,17),@char),
  REPLICATE(@char,9), @char),
  REPLICATE(@char,5), @char),
  REPLICATE(@char,3), @char),
  REPLICATE(@char,2), @char),
  REPLICATE(@char,2), @char);
GO

CREATE FUNCTION dbo.PatReplace8K
(
  @string  VARCHAR(8000),
  @pattern VARCHAR(50),
  @replace VARCHAR(1)
) 
/*****************************************************************************************
Purpose:
 Given a string (@String), a pattern (@Pattern), and a replacement character (@Replace)
 PatReplace8K will replace any character in @String that matches the @Pattern parameter 
 with the character, @Replace.

Usage:
--===== Basic Syntax Example
 SELECT pr.NewString
 FROM dbo.PatReplace8K(@String,@Pattern,@Replace);

--===== Replace numeric characters with a "*"
 SELECT pr.NewString
 FROM dbo.PatReplace8K('My phone number is 555-2211','[0-9]','*') pr;

--==== Using againsts a table
 DECLARE @table TABLE(OldString varchar(40));
 INSERT @table VALUES 
 ('Call me at 555-222-6666'),
 ('phone number: (312)555-2323'),
 ('He can be reached at 444.665.4466');
 SELECT t.OldString, pr.NewString
 FROM @table t
 CROSS APPLY dbo.PatReplace8K(t.oldstring,'[0-9]','*') pr;

 Programmer Notes:
 1. Required SQL Server 2008+
 2. @Pattern IS case sensitive but can be easily modified to make it case insensitive
 3. There is no need to include the "%" before and/or after your pattern since since we 
    are evaluating each character individually
 4. Certain special characters, such as "$" and "%" need to be escaped with a "/"
    like so: [/$/%]

Revision History:
 Rev 00 - 10/27/2014 Initial Development - Alan Burstein

 Rev 01 - 10/29/2014 Mar 2007 - Alan Burstein
        - Redesigned based on the dbo.STRIP_NUM_EE by Eirikur Eiriksson
          (see: http://www.sqlservercentral.com/Forums/Topic1585850-391-2.aspx)
        - change how the cte tally table is created 
        - put the include/exclude logic in a CASE statement instead of a WHERE clause
        - Added Latin1_General_BIN Colation
        - Add code to use the pattern as a parameter.

 Rev 02 - 20141106
        - Added final performane enhancement (more cudo's to Eirikur Eiriksson)
        - Put 0 = PATINDEX filter logic into the WHERE clause

Rev 03  - 20150516
        - Updated to deal with special XML characters

Rev 04  - 20170320
        - changed @replace from char(1) to varchar(1) to address how spaces are handled
*****************************************************************************************/
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
WITH
E1(N) AS (SELECT N FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS E1(N)),
iTally(N) AS 
(
  SELECT TOP (LEN(@String)) CHECKSUM(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) 
  FROM E1 a,E1 b,E1 c,E1 d
)
SELECT NewString =
((
  SELECT
    CASE 
      WHEN PATINDEX(@Pattern,SUBSTRING(@String COLLATE Latin1_General_BIN,N,1)) = 0
      THEN SUBSTRING(@String,N,1)
      ELSE @replace
    END
  FROM iTally
  FOR XML PATH(''), TYPE
).value('.[1]','varchar(8000)'));
GO
0 голосов
/ 22 апреля 2019

Как и было обещано, для всех, кто хотел увидеть метод REPLACE () ...

SELECT 'Product' Source
  ,prd.[id]
  ,prd.[name] as Title
  ,CAST(prd.[description] as varchar(max)) as [Description]
  ,'/' + lower(replace(replace(RTrim(par.name), ' &', ''), ' ' ,'-') + '/' + REPLACE(replace(replace(RTrim(child.name),'\',''), ' &', ''), ' ', '-') + '/' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LTRIM(RTrim(prd.name)),'.',''),'$',''),'/',''),')',''),'(',''),'-',''),',',''), '''',''), '"', ''), ' &', ''),'  ',' '), ' ' , '-') )  as Link
  ,prd.[upc] as GTIN
  ,prd.[active]
FROM [dbo].[Products] prd
  INNER join [dbo].[CategoryProducts] catprd ON catprd.productId = prd.id
  INNER JOIN [dbo].[Categories] child on child.Id = catprd.categoryId
  INNER join [dbo].[Categories]  par on par.id = child.parentCategoryId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...