Лучший способ для анализа целочисленных значений из строки с разделителями T-SQL - PullRequest
1 голос
/ 27 июля 2011

У меня есть хранимая процедура SQLServer2008 R2, которая содержит алгоритм для анализа целых чисел из строки с разделителями.

Вот пример кода SQL, который я создал для циклического прохождения строки с разделителями и извлечения любых чисел, которыеможет существовать в строке с разделителями:

-- Create a delimited list for testing
DECLARE @NumericList nvarchar(MAX) = N'1, 33,44 ,55, foo ,666,77 77,8,bar,9,10'

-- Declare the delimiter
DECLARE @ListDelimiter VARCHAR(1) = ','

-- Remove white space from the list
SET @NumericList = REPLACE(@NumericList, ' ','');

-- Var that will hold the value of the delimited item during the while-loop
DECLARE @NumberInScope VARCHAR(MAX)

WHILE(LEN(@NumericList) > 0)
BEGIN
    -- Get the value to the left of the first delimiter.
    IF(CHARINDEX(@ListDelimiter, @NumericList) > 0)
        SET @NumberInScope = LEFT(@NumericList, CHARINDEX(@ListDelimiter, @NumericList))
    ELSE
        SET @NumberInScope = @NumericList   

    -- Remove the @NumberInScope value from the @NumericList
    SET @NumericList = RIGHT(@NumericList, LEN(@NumericList) - LEN(@NumberInScope))

    -- Remove the delimiter from the @NumberInScope
    SET @NumberInScope = REPLACE(@NumberInScope,@ListDelimiter,'')

    -- Print only the integer values
    IF(ISNUMERIC(@NumberInScope) = 1)
    BEGIN
        PRINT @NumberInScope
    END 
END

Приведенный выше код работает нормально, но после просмотра кода мне кажется, что должен быть более краткий способ сделать то же самое.Другими словами, есть ли какие-либо строковые функции (или любая новая функция R2, ​​может быть), которую я упускаю из виду, что я могу реализовать, что уменьшило бы код и, надеюсь, было бы легче читать?

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Определенная статья - это «Массивы и списки в SQL Server 2005 и более поздних версиях»

Здесь показано несколько методов разделения CSV: CLR, таблица Numbers,WHILE петли

2 голосов
/ 27 июля 2011

Вот код, вы также можете создать функцию 'split' и использовать это

DECLARE @NumericList nvarchar(max) = N'1, 33,44 ,55, foo ,666,77 77,8,bar,9,10'

;WITH cte as (
SELECT CAST(1 as bigint) p1,  CHARINDEX(',', @NumericList+',') p2, 
CAST(null as Nvarchar(max)) NumberInScope 
UNION ALL
SELECT p2 + 1, CHARINDEX(',',@NumericList+',', p2 + 1), 
SUBSTRING(@NumericList, p1, p2-p1) 
FROM cte WHERE p2>0
)
SELECT NumberInScope from cte WHERE isnumeric(NumberInScope) > 0
OPTION (MAXRECURSION 0)
1 голос
/ 22 апреля 2016

В MSSql Server 2016 появилось новое ключевое слово STRING_SPLIT для выполнения желаемой операции.

SELECT STRING_SPLIT ( string , separator )

См. https://msdn.microsoft.com/en-us/library/mt684588.aspx

...