Автор: DeColo®es
Ох, разные задачи приходится решать на SQL Server...
Одна из последних - для какого-то отчета руководству потребовалось получить информацию о том, сколько в наших базах таблиц и процедур, а для процедур - общее количество строк кода.
Ну, с объектами баз данных проблем нет - получаем список из sys.objects и группируем по типу.
А вот со строками кода - как их подсчитать? Не парсить же все процедуры, разбивая на строки, тем более, что процедур несколько тысяч.
Проблема перестает быть сложной, если вспомнить, что строки разделены специальными символами - "перевод строки" (char(10)) и "возврат каретки" (char(13)) Назначение и историю итих символов можно прочитать в wikipedia, для нашей задачи вполне достаточно того, что как правило в Windows системах присутствуют оба символа.
Теперь задача подсчета количества строк в тексте сводится к тому, чтобы подсчитать количество комбинаций этих символов в строке. Вполне достаточно даже будет считать не оба символа, а только один из них.
Итак, количество строк = количество символов + 1.
Для подсчета числа символов в T-SQL не предусмотрено отдельной функции, но и свою писать не нужно.
Достаточно сравнить длину строки с длиной строки, из которой эти символы "вырезаны":
В нашем случае, у нас остается символ char(13), поэтому будут учтены даже пустые строки, состоящие из пробелов.
Итого, для решения "исходной" задачи, получаем скрипт:
Одна из последних - для какого-то отчета руководству потребовалось получить информацию о том, сколько в наших базах таблиц и процедур, а для процедур - общее количество строк кода.
Ну, с объектами баз данных проблем нет - получаем список из 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 сервере