Как подсчитать число определенных символов в строке на T-SQL

добавлено: 04 фев 11
понравилось:0
просмотров: 11064
комментов: 8

теги:

Автор: DeColo®es

Ох, разные задачи приходится решать на SQL Server...
Одна из последних - для какого-то отчета руководству потребовалось получить информацию о том, сколько в наших базах таблиц и процедур, а для процедур - общее количество строк кода.

Ну, с объектами баз данных проблем нет - получаем список из sys.objects и группируем по типу.
А вот со строками кода - как их подсчитать? Не парсить же все процедуры, разбивая на строки, тем более, что процедур несколько тысяч.
Проблема перестает быть сложной, если вспомнить, что строки разделены специальными символами - "перевод строки" (char(10)) и "возврат каретки" (char(13)) Назначение и историю итих символов можно прочитать в wikipedia, для нашей задачи вполне достаточно того, что как правило в Windows системах присутствуют оба символа.
Теперь задача подсчета количества строк в тексте сводится к тому, чтобы подсчитать количество комбинаций этих символов в строке. Вполне достаточно даже будет считать не оба символа, а только один из них.
Итак, количество строк = количество символов + 1.
Для подсчета числа символов в T-SQL не предусмотрено отдельной функции, но и свою писать не нужно.
Достаточно сравнить длину строки с длиной строки, из которой эти символы "вырезаны":
declare @str varchar(800) 
set @str = 'create procedure sample
as
begin
	select ''something''
end'
select len(@str) - len(replace(@str, char(10), '')) + 1
Поскольку функция LEN, возвращающая длину строки, не учитывает конечные пробелы, для общего решения нужно либо использовать DATALENGTH, либо добавлять к строке еще один символ, который не будет вырезаться.
В нашем случае, у нас остается символ char(13), поэтому будут учтены даже пустые строки, состоящие из пробелов.

Итого, для решения "исходной" задачи, получаем скрипт:
select
	so.type_desc, 
	count(*) as [#objects],
	sum(len(definition)-len(replace(definition, char(10), '')))  + 1 as [#lines]
from sys.objects so
left join sys.sql_modules sm 
	 on sm.[object_id] = so.object_id
group by so.type_desc  
order by type_desc 

Комментарии


  • Ужасы какие...

  • Мне надо посчитать количетсво запятых в строке

  • declare @str varchar(800)
    set @str = '1,2,3,4,5,6,7'
    select len(@str) - len(replace(@str, char(44), ''))

  • Для "обычных" символов функция char не нужна:
    select len(@str) - len(replace(@str, ',', ''))

  • Мне нужно посчитать кол-во русских и нерусских (английских, немецких, и проч) букв в строке, чтобы по их соотношению сделать вывод, является ли строка русским текстом.

  • ИМХО в такой постановке задачи достоточно наличия одной русской быквы, чтобы сделать вывод, что текст русский.

  • в МОЕЙ постановке задачи нельзя сделать вывод о языке всей строки при нахождении всего одной русской буквы. Вот примеры:
    "Verstдrkung Motortrдger oben links"
    "Tьrverkleidung vorne links / Airbag"
    "5910/9901 K.Leder FR schw [мин. кол-во = 3]"
    "КОЛЕСНЫЙ ДИСК 16`` CAMRY 06. RAV 06"
    В первом приближении можно считать, что если в строке больше 3-х русских букв и кол-во русских превышает кол-во нерусских, то это - русская строка, иначе - нет.

  • А! собсно вопрос как максимально быстро определить является ли строка русской для нескольких десятков миллионов строк на SQL сервере



Необходимо войти на сайт, чтобы оставлять комментарии