powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / подсчет строк процедур, триггеров, функций, вьюх
9 сообщений из 9, страница 1 из 1
подсчет строк процедур, триггеров, функций, вьюх
    #39996740
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Решил написать процедуру, которая подмчитывала бы количество строк кода в процедурах и других объектах БД.

Набросал код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
-->переменные курсора-------------------
DECLARE @ID			   UNIQUEIDENTIFIER,
		@server_name   VARCHAR(25),
	    @DBase_dbname  VARCHAR(25),
	    @Schema_sname  VARCHAR(25),
	    @object_oname  VARCHAR(50),
	    @oType		   VARCHAR(3),
	    @oType_desc	   VARCHAR(20),
	    @Creation_date DATETIME
--переменные курсора<------------------

DECLARE @DB_S_O		   NVARCHAR(100) --переменная БД+схема+объект

IF OBJECT_ID('tempdb..#all_objects') IS NOT NULL
BEGIN
	DROP TABLE #all_objects
END

SELECT NEWID() AS ID,
	   @@SERVERNAME AS Server_Name,
	   DB_NAME() AS DBase_dbname,
	   sch.name AS Schema_sname, 
	   obj.name AS object_oname,
	   obj.type AS oType,
	   obj.type_desc AS oType_desc,
	   obj.create_date AS Creation_date
INTO #all_objects
FROM		sys.objects		obj
INNER JOIN	sys.schemas		sch	ON obj.schema_id = sch.schema_id
WHERE obj.type IN ('P', 'FN', 'TR', 'IF', 'TF', 'V', 'X')


DECLARE oCounter CURSOR FOR

SELECT ID,
	   server_name,
	   DBase_dbname,
	   Schema_sname,
	   object_oname,
	   oType,
	   oType_desc,
	   Creation_date
FROM #all_objects

OPEN oCounter

FETCH NEXT FROM oCounter INTO	@ID,
								@server_name,
								@DBase_dbname,
								@Schema_sname,
								@object_oname,
								@oType,
								@oType_desc,
								@Creation_date

WHILE (@@FETCH_STATUS = 0)
	BEGIN
--временная таблица для записи всех строк объектов ДБ отдельно по каждому объекту
		IF OBJECT_ID('tempdb..#counting') IS NOT NULL
			BEGIN
				DROP TABLE #counting
			END
		
			CREATE TABLE #counting
			(
			 rows_count NVARCHAR(MAX) DEFAULT NULL
			)

--назначим переменной @DB_S_O путь к объекту в виде БД+Схема+объект
			SET @DB_S_O = @DBase_dbname + '.' + @Schema_sname + '.' + @object_oname

--вставим строки во временную таблицу отдельно по каждому объекту
--тут получается я вставляю только 1 столбец, который мне дает процедура sp_helptext
			INSERT INTO #counting
			EXEC sp_helptext @DB_S_O

--подсчитаем количество строк в каждом объекте БД
--тут соответственно считаю количество строк в этом столбце
			SELECT COUNT(*) FROM #counting

--запишем все данные в итоговую таблицу
--следующим запросом я бы хотел бы видеть итоговый результат, - запись всех данных по каждому объекту в таблицу dbo.THE_FINAL_COUNTDOWN, но я не могу понять как это сделать?		
--чтобы итоговая таблица выглядела след. образом:
--  ID				UNIQUEIDENTIFIER  NOT NULL,
-- Server_name	NVARCHAR(25) DEFAULT NULL,
-- DBase_name		NVARCHAR(25) DEFAULT NULL,
-- Schema_sname	NVARCHAR(25) DEFAULT NULL,
-- Object_oname	NVARCHAR(50) DEFAULT NULL,
-- OType			NVARCHAR(3) DEFAULT NULL,
-- OType_desc		NVARCHAR(20) DEFAULT NULL,
-- Row_counting	INT DEFAULT NULL, -- как раз тот столбец, который мы подсчитали предыдущим запросом.
-- Creation_date	DATETIME DEFAULT NULL
	    

FETCH NEXT FROM oCounter INTO	@ID,
								@server_name,
								@DBase_dbname,
								@Schema_sname,
								@object_oname,
								@oType,
								@oType_desc,
								@Creation_date
		
   END
CLOSE oCounter
DEALLOCATE oCounter

--скрипт итоговой таблицы

CREATE TABLE dbo.THE_FINAL_COUNTDOWN
(
 ID				UNIQUEIDENTIFIER  NOT NULL,
 Server_name	NVARCHAR(25) DEFAULT NULL,
 DBase_name		NVARCHAR(25) DEFAULT NULL,
 Schema_sname	NVARCHAR(25) DEFAULT NULL,
 Object_oname	NVARCHAR(50) DEFAULT NULL,
 OType			NVARCHAR(3) DEFAULT NULL,
 OType_desc		NVARCHAR(20) DEFAULT NULL,
 Row_counting	INT DEFAULT NULL,
 Creation_date	DATETIME DEFAULT NULL


Вобщем запутался, прошу вас подсказать как можно реализовать вставку количества строк по кадому объекту ДБ, которые были записаны в таблице #all_objects в итоговую таблицу dbo.THE_FINAL_COUNTDOWN

Заранее благодарен.
)
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996744
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, object_definition() для упоротых.
Во-вторых, cloc для тех, кто хочет считать строки кода отдельно от пустых строк или комментариев.
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996747
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Добрый день - я не могу устанавливать стороннее ПО на боевой среде.
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996748
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermama
Добрый день - я не могу устанавливать стороннее ПО на боевой среде.
Прикиньте, чтобы считать строки кода, боевая среда не нужна. По секрету, так сказать.
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996826
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @lf char(1) = char(10), @cr char(1) = char(13);

select
 count(*)
from
 sys.objects o cross apply
 (select replace(replace(replace(object_definition(o.object_id), @cr + @lf, @lf), @lf + @cr, @lf), @cr, @lf)) d(s) cross apply
 string_split(d.s, @lf) l
where
 o.type in ('P', 'FN', 'TR', 'IF', 'TF', 'V', 'X');
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996830
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @lf char(1) = char(10), @cr char(1) = char(13);

select
 count(*)
from
 sys.objects o cross apply
 (select replace(replace(replace(object_definition(o.object_id), @cr + @lf, @lf), @lf + @cr, @lf), @cr, @lf)) d(s) cross apply
 string_split(d.s, @lf) l
where
 o.type in ('P', 'FN', 'TR', 'IF', 'TF', 'V', 'X');



Нет, ребяты демократы, только чай!
Зачем сложные телодвижения со string_split?

Код: sql
1.
2.
3.
len( replace(replace(replace(object_definition(o.object_id), @cr + @lf, @lf), @lf + @cr, @lf), @cr, @lf)) )
-
len( replace(replace(replace(replace(object_definition(o.object_id), @cr + @lf, @lf), @lf + @cr, @lf), @cr, @lf), @lf, '') )



количество удаленных символов @lf = количество строк.
И сервер вам спасибо скажет.
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996838
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Зачем сложные телодвижения со string_split?
Затем, что это "рыба".
На случай, если потребуется дополнительная фильтрация.
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996841
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @lf char(1) = char(10), @cr char(1) = char(13);

select
 count(*)
from
 sys.objects o cross apply
 (select replace(replace(replace(object_definition(o.object_id), @cr + @lf, @lf), @lf + @cr, @lf), @cr, @lf)) d(s) cross apply
 string_split(d.s, @lf) l
where
 o.type in ('P', 'FN', 'TR', 'IF', 'TF', 'V', 'X');



Хмммм, выше юзер написал "Во-первых, object_definition() для упоротых."
Даже и не знаю
...
Рейтинг: 0 / 0
подсчет строк процедур, триггеров, функций, вьюх
    #39996846
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Хмммм, выше юзер написал "Во-первых, object_definition() для упоротых."
Даже и не знаю
Я там не только это написал.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / подсчет строк процедур, триггеров, функций, вьюх
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]