Решение:
Другой возможный подход - использование рекурсивного CTE (который возвращает каждую цифру и цифру) и групповой конкатенации.
Использование STRING_AGG () (из SQL Server 2017):
DECLARE @ones varchar(16)
SET @ones = '1000000001001011';
WITH Digits AS (
SELECT 1 AS DigitPosition, SUBSTRING(@ones, 1, 1) AS Digit
UNION ALL
SELECT DigitPosition + 1, SUBSTRING(@ones, DigitPosition + 1, 1)
FROM Digits
WHERE DigitPosition < LEN(@ones)
)
SELECT STRING_AGG(DigitPosition, ',')
FROM Digits
WHERE Digit = '1'
Использование ДЛЯ XML :
DECLARE @ones varchar(16)
SET @ones = '1000000001001011';
WITH Digits AS (
SELECT 1 AS DigitPosition, SUBSTRING(@ones, 1, 1) AS Digit
UNION ALL
SELECT DigitPosition + 1, SUBSTRING(@ones, DigitPosition + 1, 1)
FROM Digits
WHERE DigitPosition < LEN(@ones)
)
SELECT CONVERT(varchar(max), DigitPosition) + ','
FROM Digits
WHERE Digit = '1'
FOR XML PATH('')
Выход:
1,10,13,15,16