Наиболее эффективный способ сделать что-то подобное, что Я могу думать о том, чтобы использовать таблицу Tally (aka Numbers). Если вы не знакомы с концепцией, вы можете прочитать об этом здесь: http://www.sqlservercentral.com/articles/T-SQL/62867/
Вы можете создать или заполнить таблицу Tally в своей базе данных (я создаю ее в своей базе данных из get-go, потому что она настолько полезна), или вы можете построить один на лету, используя CTE, но это делает больше кода, который вы должны создать. Для этого поста я буду использовать метод КТР, так что вы можете просто скопировать и вставить решение попробовать его:
DECLARE @pString VARCHAR(8000);
SELECT @pString = 'Çüé the quick brown fox which gave me 50¢.';
--===== "Inline" CTE Driven "Tally Table" produces values from 0 up to 10,000... enough to cover VARCHAR(8000)
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), --10E+1 or 10 rows
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
TallyCTE(N) AS (--=== This provides the "zero base" and limits the number of rows right up front
-- for both a performance gain and prevention of accidental "overruns"
SELECT 0 UNION ALL
SELECT TOP (DATALENGTH(ISNULL(@pString,1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
--===== Return all t.N+1 positions and calculate the length of the element for each starting position
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY s.N),
StartPosition = s.N,
TheCharacter = SUBSTRING(@pString, N, 1)
FROM TallyCTE s
WHERE N <= LEN(@pString)
AND ASCII(SUBSTRING(@pString, N, 1)) > 127
Если вы должны были сохраняться в таблице Tally ваш запрос может быть упрощенных так:
DECLARE @Parameter VARCHAR(8000);
SET @Parameter = 'Çüé,Element01,Element02,Element03,Element04,Element05,50¢';
SELECT N,
SUBSTRING(@Parameter, N, 1)
FROM dbo.Tally
WHERE N <= LEN(@Parameter)
AND ASCII(SUBSTRING(@Parameter, N, 1)) > 127
ORDER BY N;
Результаты оба:
, но я имею дело с описанием поля, как следует, что положить в? – william007
просто замените @str описанием, например. select description, case when convert (float, dbo.fn_CountAscii (описание))/len (description)> 0.5 then 1 else 0 end как MoreAsciiThanNonAscii из [DataExtraction]. [dbo]. [Обратная связь] –