SSMS собирает несколько переменных из строки - PullRequest
0 голосов
/ 06 мая 2020

Я использую SQL Server 2008 и SSMS, и я пытаюсь собрать несколько значений переменных из одной строки.

Этот метод работает только при ОДНОЙ переменной:

Строка:

There are 2 dogs walking the park in the summer and there are 4 dogs walking the park in the winter
SELECT 
    SUBSTRING(@txt, CHARINDEX('are', @txt), 
                    CHARINDEX('dogs', @txt) - CHARINDEX('are', @txt) + LEN('dogs')) 

Результат будет 2. Я ищу способ получить либо 2, либо 4, либо всего 6.

Если моя информация неполная, оставьте, пожалуйста, комментарий.

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Один из способов - разделить строку на отдельные части в зависимости от того, где находятся пробелы, затем выяснить, какие числа являются целыми, а затем SUM. Поскольку вы используете неподдерживаемую версию SQL Server, у вас нет доступа к TRY_CONVERT, что упростило бы этот способ , однако вы можете хотя бы использовать DelimitedSplit8K, в результате получается что-то вроде этого:

SELECT SUM(CONVERT(int,DS.Item))
FROM (VALUES('There are 2 dogs walking the park in the summer and there are 4 dogs walking the park in the winte'))V(YourString)
     CROSS APPLY dbo.DelimitedSplit8K(V.YourString,' ') DS
WHERE DS.Item NOT LIKE '%[^0-9]%';
0 голосов
/ 06 мая 2020

Это намного проще в более поздних, ПОДДЕРЖИВАЕМЫХ версиях SQL Server. В SQL Server 2008 вы можете использовать рекурсивный CTE:

with cte as (
      select convert(varchar(max), 'There are 2 dogs walking the park in the summer and there are 4 dogs walking the park in the winter') as rest,
             convert(varchar(max), null) as val, 1 as lev
      union all
      select stuff(v.val, 1, patindex('%[^0-9]%', v.val + ' ') - 1, ''),
             left(v.val, patindex('%[^0-9]%', v.val + ' ')), lev + 1
      from cte cross apply
           (values (stuff(cte.rest, 1, patindex('%[0-9]%', cte.rest) - 1, ''))) v(val)
      where cte.rest like '%[0-9]%' 
     )
select val
from cte
where val is not null;

Здесь - скрипт db <>.

...