powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выполнить генерируемый на лету скрипт к каждой строке набора данных
8 сообщений из 8, страница 1 из 1
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846611
Pasha4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как можно выполнить для каждой строки набора данных скрипт, который генерируется на лету. Если бы была функция, то CROSS APPLY подошел, но ситуация иная: есть список таблиц из базы, и генерируемый скрипт (текст), который для каждой строки(таблицы) считает количество строк в ней.

SELECT SCHEMA_NAME(SCHEMA_ID) + '.' + o.name as table_name,
'Select ''' + SCHEMA_NAME(SCHEMA_ID) + '.'
+ o.name + ''' as DBName, count(*) as Count From ' + SCHEMA_NAME(SCHEMA_ID) + '.'
+ o.name
+ ';' AS ' Script generator'
FROM sys.objects o
WHERE o.[type] = 'U'
ORDER BY SCHEMA_NAME(o.schema_id), o.name;

Спустя время я додумался взять выдачу кода выше (поле Script generator), поставить UNION в конце каждой строки и запустить снова. Норм. Но хочется знать как одним запросом это сделать. Курсор/цикл какой-нибудь.. или как?
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846627
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha4Спустя время я додумался взять выдачу кода выше (поле Script generator), поставить UNION в конце каждой строки и запустить снова. Норм. Но хочется знать как одним запросом это сделать. Курсор/цикл какой-нибудь.. или как?Положить полученное в переменную, и выполнить командой EXEC()
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846628
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha4,
ну а чем не подходит курсор?
Условия задачи не понятны. Поясните...
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846631
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha4,

если я правильно понял, то стоит задача вернуть список таблиц и кол-во записей в них

см тут:
https://blog.sqlauthority.com/2017/05/25/sql-server-simple-query-list-size-table-row-counts/
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846719
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ms_forEachTable ?
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846721
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для такого частного случая действительно наверное простейший вариант
пойти путём предложенным SIMPLicity_ типа (что первое нагуглилось):
Код: sql
1.
2.
3.
4.
declare @t table(TableName nvarchar(128),NumRecords int)
insert into @t exec sp_MSforeachtable
'SELECT ''?'' TableName, Count(1) NumRecords from ?'
select*from @t order by 1

или то что Profiler перехватывает при выполнении отчёта "Disk Usage by Table" в SSMS
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT a3.name [schemaname],a2.name [tablename],a1.rows row_count,
       (a1.reserved+ISNULL(a4.reserved,0))*8 reserved,a1.data*8 data,
(CASE WHEN (a1.used+ISNULL(a4.used,0))>a1.data THEN(a1.used+ISNULL(a4.used,0))-a1.data ELSE 0 END)*8 index_size,
(CASE WHEN (a1.reserved+ISNULL(a4.reserved,0))>a1.used THEN(a1.reserved+ISNULL(a4.reserved,0))-a1.used ELSE 0 END)*8 unused
FROM(SELECT ps.object_id,SUM(CASE WHEN(ps.index_id < 2)THEN row_count ELSE 0 END)[rows],
		SUM(ps.reserved_page_count)reserved,
		SUM(CASE WHEN(ps.index_id<2)THEN(ps.in_row_data_page_count+ps.lob_used_page_count+ps.row_overflow_used_page_count)
				ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)END)data,
		SUM(ps.used_page_count)used
	FROM sys.dm_db_partition_stats ps
    WHERE ps.object_id NOT IN (SELECT object_id FROM sys.tables WHERE is_memory_optimized=1)
	GROUP BY ps.object_id)a1
LEFT OUTER JOIN(SELECT it.parent_id,SUM(ps.reserved_page_count)reserved,SUM(ps.used_page_count)used
	 FROM sys.dm_db_partition_stats ps INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
	 WHERE it.internal_type IN (202,204)
	 GROUP BY it.parent_id)a4 ON a4.parent_id = a1.object_id
INNER JOIN sys.all_objects a2  ON a1.object_id = a2.object_id
INNER JOIN sys.schemas a3 ON a2.schema_id = a3.schema_id
WHERE a2.type <> N'S' and a2.type <> N'IT'
ORDER BY a3.name, a2.name

для более сложных вариантов например для каждой
строки свой скрипт то через скалярную функцию
(в которой обычно процедуру не вызвать, за искл. нескольких специальных)
так что только которая CLR
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846725
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..что в принципе упрощается в
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT a3.name[schemaname],a2.name[tablename],a1.rows row_count FROM
(SELECT ps.object_id,SUM(CASE WHEN(ps.index_id<2)THEN row_count ELSE 0 END)[rows]
from sys.dm_db_partition_stats ps
WHERE ps.object_id NOT IN(SELECT object_id FROM sys.tables WHERE is_memory_optimized=1)
group by ps.object_id)a1 INNER JOIN sys.all_objects a2 ON a1.object_id=a2.object_id
INNER JOIN sys.schemas a3 ON a2.schema_id=a3.schema_id
WHERE a2.type<>N'S'and a2.type<>N'IT'ORDER BY 1,2
...
Рейтинг: 0 / 0
выполнить генерируемый на лету скрипт к каждой строке набора данных
    #39846889
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha4,

Эту задачу проще и нагляднее решить курсором по списку объектов.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выполнить генерируемый на лету скрипт к каждой строке набора данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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