сортировка заданного массива на сервере sql - PullRequest
0 голосов
/ 15 марта 2019

В SQL нет функции сортировки для сортировки строки.

У меня есть эта функция, но, похоже, с ней проблема.

Любая помощь будет оценена.

ALTER FUNCTION [dbo].[Sorting] (@str VARCHAR(5000))
returns VARCHAR(5000)
  BEGIN
      DECLARE @len    INT,
              @cnt    INT =1,
              @str1   VARCHAR(5000)='',
              @output VARCHAR(5000)=''

      SELECT @len = Len(@str)
      WHILE @cnt <= @len
        BEGIN
            SELECT @str1 += Substring(@str, @cnt, 1) + ','

            SET @cnt+=1
        END

      SELECT @str1 = LEFT(@str1, Len(@str1) - 1)

      SELECT @output += Sp_data
      FROM  (SELECT Split.a.value('.', 'VARCHAR(5000)') Sp_data
             FROM   (SELECT Cast ('<M>' + Replace(@str1, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
                    CROSS APPLY Data.nodes ('/M') AS Split(a)) A
      ORDER  BY Sp_data

      RETURN @output
  END

Ответы [ 2 ]

1 голос
/ 15 марта 2019

С какими проблемами вы сталкиваетесь?

Ниже приведена модифицированная версия без использования XML.

-- Prior to SQL Server 2016
CREATE FUNCTION [dbo].[Sorting] (@str VARCHAR(5000))
returns VARCHAR(5000)
  BEGIN
      DECLARE @len    INT,
              @cnt    INT =1,
              @str1   VARCHAR(5000)='',
              @output VARCHAR(5000)='';

     DECLARE @chr TABLE (c VARCHAR(10));

      SELECT @len = Len(@str)
      WHILE @cnt <= @len
        BEGIN

            INSERT INTO @chr (c)
            SELECT Substring(@str, @cnt, 1)

            SET @cnt+=1
        END

        SELECT @output = @output + c 
        FROM @chr ORDER BY c;

        RETURN @output
  END
GO

Если вы используете SQL Server 2016 и выше, вы можете использовать функцию SPLIT_STRING, как показано ниже

-- Since SQL Server 2016
CREATE FUNCTION [dbo].[Sorting] (@str VARCHAR(5000))
returns VARCHAR(5000)
  BEGIN
      DECLARE @len    INT,
              @cnt    INT =1,
              @str1   VARCHAR(5000)='',
              @output VARCHAR(5000)='';

     DECLARE @chr TABLE (c VARCHAR(10));

      SELECT @len = Len(@str)
      WHILE @cnt <= @len
        BEGIN

            SELECT @str1 += Substring(@str, @cnt, 1) + ','

            SET @cnt+=1
        END

        SELECT @str1 = LEFT(@str1, Len(@str1) - 1);

        SELECT @output = @output + value 
        FROM STRING_SPLIT(@str1, ',') ORDER BY value;

        RETURN @output
  END
GO
1 голос
/ 15 марта 2019

Если я правильно понимаю ваш вопрос, вы можете попытаться изменить свой UDF следующим образом:

Функция:

CREATE FUNCTION [dbo].[Sorting] (@text VARCHAR(5000)) RETURNS VARCHAR(5000)
BEGIN
    ;WITH TallyCTE (n) AS (
        -- 10000 rows
        SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
        CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
        CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
        CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n)
    ), SymbolsCTE (s) AS (
        SELECT SUBSTRING(@text, n, 1)
        FROM TallyCTE
        WHERE n <= LEN(@text)
    )
    SELECT @text = (
        SELECT CONCAT(s, '')
        FROM SymbolsCTE
        ORDER BY s
        FOR XML PATH(''),TYPE
        ).value('.','varchar(5000)')
    RETURN @text
END

Заявление:

SELECT dbo.Sorting('QWERTYUIOPASDF1234GHJKL5678ZXC90VBNM')

Вывод:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...