Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выполнить генерируемый на лету скрипт к каждой строке набора данных / 8 сообщений из 8, страница 1 из 1
07.08.2019, 19:24
    #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
07.08.2019, 20:09
    #39846627
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выполнить генерируемый на лету скрипт к каждой строке набора данных
Pasha4Спустя время я додумался взять выдачу кода выше (поле Script generator), поставить UNION в конце каждой строки и запустить снова. Норм. Но хочется знать как одним запросом это сделать. Курсор/цикл какой-нибудь.. или как?Положить полученное в переменную, и выполнить командой EXEC()
...
Рейтинг: 0 / 0
07.08.2019, 20:12
    #39846628
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выполнить генерируемый на лету скрипт к каждой строке набора данных
Pasha4,
ну а чем не подходит курсор?
Условия задачи не понятны. Поясните...
...
Рейтинг: 0 / 0
07.08.2019, 20:24
    #39846631
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выполнить генерируемый на лету скрипт к каждой строке набора данных
Pasha4,

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

см тут:
https://blog.sqlauthority.com/2017/05/25/sql-server-simple-query-list-size-table-row-counts/
...
Рейтинг: 0 / 0
08.08.2019, 03:26
    #39846719
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выполнить генерируемый на лету скрипт к каждой строке набора данных
ms_forEachTable ?
...
Рейтинг: 0 / 0
08.08.2019, 04:46
    #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
08.08.2019, 05:03
    #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
08.08.2019, 11:59
    #39846889
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выполнить генерируемый на лету скрипт к каждой строке набора данных
Pasha4,

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


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